sql >> Databasteknik >  >> RDS >> PostgreSQL

Vilken typ av JOIN som ska användas

Uppenbarligen har du dubbletter av värden för båda de sammanfogade kolumnerna. Istället för den kartesiska produkten en [INNER] JOIN skulle producera för detta vill du att varje rad endast ska användas en gång . Du kan uppnå detta genom att lägga till ett radnummer (rn ) per dubblett och gå med på rn dessutom.

Varje tabell kan ha fler eller färre duper för samma värde än den andra om du inte har ytterligare restriktioner på plats (som en FK-begränsning) - men det står ingenting i din fråga. För att behålla alla rader ett skulle använda en FULL [OUTER] JOIN . Men du vill behålla 10 000 poster i resultatet, vilket är kardinaliteten för table2 . Så det måste vara en LEFT [OUTER] JOIN table1 (med 40 rader) - och exkludera eventuella överdrivna rader från table1 .

SELECT t1."LocationArea", t2."Location"
FROM  (
   SELECT "Location"
        , row_number() OVER (PARTITION BY "Location") AS rn
   FROM   table2
   ) t2
LEFT JOIN (
   SELECT "LocationArea"
        , row_number() OVER (PARTITION BY "LocationArea") AS rn
   FROM   table1
   ) t1 ON t1."LocationArea" = t2."Location"
       AND t1.rn = t2.rn;

Fungerar för Postgres eller SQL Server. MySQL stöder inte fönsterfunktioner, du skulle behöva en ersättning:

  • SQL SELECT senaste posten utan begränsning

För att vara tydlig:LEFT JOIN är bara en förkortning för LEFT OUTER JOIN , så du använder redan en yttre koppling. Ditt uttalande är ett missförstånd :

Jag använder ZOHO-rapporter som inte stöder yttre anslutningar.



  1. Allmänna instruktioner för att bygga och distribuera databasserver

  2. Mappning av PostgreSQL-text[][]-typ och Java-typ

  3. Kan jag köra flera frågor separerade med semikolon med MySQL Connector/J?

  4. Dolda funktioner i PostgreSQL