På grund av RAND()
din underfråga är inte deterministisk och exekveras därför för varje rad i Sponsor
tabell och återställer varje gång ett slumpmässigt ID som kan matcha eller inte matcha den aktuella radens ID. Så det är inte bara möjligt att ingen rad matchar det slumpmässiga ID:t. Det är också möjligt att flera rader gör det.
För exempeldata med två sponsorer kan underfrågan returnera följande värden:
- (1, 1) matchar den första raden (1=1, 2=1)
- (1, 2) matchar båda raderna (1=1, 2=2)
- (2, 1) matchar ingen rad (1=2, 2=1)
- (2, 2) matchar den andra raden (1=2, 2=2)
För att garantera att underfrågan endast körs en gång kan du använda den i SELECT-satsen. Slå sedan ihop resultatet som härledd tabell med Sponsor
tabell:
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