På grund af RAND()
din underforespørgsel er ikke deterministisk og udføres derfor for hver række i Sponsor
tabel og genindstiller hver gang et tilfældigt id, som måske matcher eller ej id'et for den aktuelle række. Så det er ikke kun muligt, at ingen række vil matche det tilfældige ID. Det er også muligt, at flere rækker vil.
For eksempeldata med to sponsorer kan underforespørgslen returnere følgende værdier:
- (1, 1) vil matche den første række (1=1, 2=1)
- (1, 2) vil matche begge rækker (1=1, 2=2)
- (2, 1) matcher ingen række (1=2, 2=1)
- (2, 2) vil matche den anden række (1=2, 2=2)
For at garantere, at underforespørgslen kun udføres én gang, kan du bruge den i SELECT-sætningen. Tilslut derefter resultatet som afledt tabel med 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