Z powodu RAND()
Twoje podzapytanie nie jest deterministyczne i dlatego jest wykonywane dla każdego wiersza w Sponsor
tabeli i za każdym razem zwraca losowy identyfikator, który może pasować lub nie do identyfikatora bieżącego wiersza. Jest więc nie tylko możliwe, że żaden wiersz nie będzie pasował do losowego identyfikatora. Możliwe jest również, że wiele wierszy będzie.
W przypadku przykładowych danych z dwoma sponsorami podzapytanie może zwrócić następujące wartości:
- (1, 1) będzie pasować do pierwszego wiersza (1=1, 2=1)
- (1, 2) pasuje do obu wierszy (1=1, 2=2)
- (2, 1) nie pasuje do żadnego wiersza (1=2, 2=1)
- (2, 2) będzie pasować do drugiego rzędu (1=2, 2=2)
Aby zagwarantować, że podzapytanie zostanie wykonane tylko raz, możesz użyć klauzuli SELECT. Następnie połącz wynik jako tabelę pochodną z Sponsor
tabela:
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