sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvilken type JOIN skal bruges

Det er klart, at du har dublerede værdier for begge sammenføjningskolonner. I stedet for det kartesiske produkt en [INNER] JOIN ville producere til dette, vil du have, at hver række kun skal bruges én gang . Du kan opnå dette ved at tilføje et rækkenummer (rn ) pr. dublet og join på rn desuden.

Hver tabel kan have flere eller færre duper for samme værdi end den anden, medmindre du har yderligere begrænsninger på plads (som en FK-begrænsning) - men der er intet i dit spørgsmål. For at beholde alle rækker man ville bruge en FULL [OUTER] JOIN . Men du vil beholde 10.000 poster i resultatet, hvilket er kardinaliteten af ​​table2 . Så det skal være en LEFT [OUTER] JOIN table1 (med 40 rækker) - og ekskluder mulige overdrevne rækker fra 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;

Virker til Postgres eller SQL Server. MySQL understøtter ikke vinduesfunktioner, du skal bruge en erstatning:

  • SQL SELECT sidste post uden begrænsning

For at være tydelig:LEFT JOIN er kun en forkortelse for LEFT OUTER JOIN , så du bruger allerede en ydre joinforbindelse. Dit udsagn er en misforståelse :

Jeg bruger ZOHO-rapporter, som ikke understøtter ydre sammenføjninger.



  1. Gyldige modifikatorer for SQLite dato/tidsfunktioner

  2. Flytter til MariaDB Backup

  3. Hvordan forespørger jeg ved hjælp af felter i den nye PostgreSQL JSON-datatype?

  4. 3 måder at liste alle lagrede procedurer i en SQL Server-database