Vanwege RAND()
uw subquery is niet deterministisch en wordt dus uitgevoerd voor elke rij in Sponsor
tabel en keert elke keer een willekeurige ID terug die al dan niet overeenkomt met de ID van de huidige rij. Het is dus niet alleen mogelijk dat geen enkele rij overeenkomt met de willekeurige ID. Het is ook mogelijk dat er meerdere rijen zijn.
Voor de voorbeeldgegevens met twee sponsors kan de subquery de volgende waarden retourneren:
- (1, 1) komt overeen met de eerste rij (1=1, 2=1)
- (1, 2) komt overeen met beide rijen (1=1, 2=2)
- (2, 1) komt met geen enkele rij overeen (1=2, 2=1)
- (2, 2) komt overeen met de tweede rij (1=2, 2=2)
Om te garanderen dat de subquery slechts één keer wordt uitgevoerd, kunt u deze gebruiken met de SELECT-component. Voeg vervolgens het resultaat toe als afgeleide tabel met de Sponsor
tafel:
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