sql >> Databasteknik >  >> RDS >> Mysql

Vänster Gå med i en enda slumpmässig inspelning MySQL

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




  1. Oracle:finns det ett verktyg för att spåra frågor, som Profiler för sql-server?

  2. Varför begås en kapslad transaktion även om TransactionScope.Complete() aldrig anropas?

  3. Hur man anropar en procedur som använder samma tabell i efter trigger

  4. MySQL WHERE IN Query - BESTÄLLNING PER Match