Karena RAND()
subquery Anda tidak deterministik dan karenanya dieksekusi untuk setiap baris di Sponsor
tabel dan setiap kali mengembalikan ID acak yang mungkin cocok atau tidak dengan ID baris saat ini. Jadi tidak hanya mungkin, tidak ada baris yang cocok dengan ID acak. Mungkin juga beberapa baris.
Untuk data sampel dengan dua sponsor, subkueri dapat mengembalikan nilai berikut:
- (1, 1) akan cocok dengan baris pertama (1=1, 2=1)
- (1, 2) akan cocok dengan kedua baris (1=1, 2=2)
- (2, 1) tidak akan cocok dengan baris (1=2, 2=1)
- (2, 2) akan cocok dengan baris kedua (1=2, 2=2)
Untuk menjamin bahwa subquery dijalankan hanya sekali, Anda dapat menggunakannya klausa SELECT. Kemudian gabungkan hasilnya sebagai tabel turunan dengan Sponsor
tabel:
SELECT C.*, S.Name AS SponName
FROM (
SELECT C.ID AS CompID, C.Name AS CompName, (
SELECT ID FROM Sponsor WHERE Company = C.ID ORDER BY RAND() LIMIT 1
) as SponID
FROM Company C
) C
LEFT JOIN Sponsor S ON S.ID = C.SponID
Demo:http://rextester.com/LSSJT25902