sql >> Database >  >> RDS >> PostgreSQL

Welk type JOIN te gebruiken?

Het is duidelijk dat u dubbele waarden hebt voor beide samenvoegkolommen. In plaats van het Cartesiaanse product een [INNER] JOIN hiervoor zou produceren, wilt u dat elke rij slechts één keer wordt gebruikt . U kunt dit bereiken door een rijnummer toe te voegen (rn ) per duplicaat en doe mee op rn bovendien.

Elke tabel kan meer of minder dupes hebben voor dezelfde waarde dan de andere, tenzij je aanvullende beperkingen hebt (zoals een FK-beperking) - maar er staat niets in je vraag. Om alles te behouden rijen zou men een FULL [OUTER] JOIN . gebruiken . Maar u wilt 10000 records in het resultaat behouden, wat de kardinaliteit is van table2 . Het moet dus een LEFT [OUTER] JOIN . zijn op table1 (met 40 rijen) - en sluit mogelijke overmatige rijen uit van 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;

Werkt voor Postgres of SQL Server. MySQL ondersteunt geen vensterfuncties, u heeft een vervanging nodig:

  • SQL SELECT laatste invoer zonder beperking

Voor de duidelijkheid:LEFT JOIN is gewoon een afkorting voor LEFT OUTER JOIN , dus u gebruikt al een outer join. Uw verklaring is een misverstand :

Ik gebruik ZOHO-rapporten die outer join's niet ondersteunen.



  1. Hoe kunt u overerving in een database weergeven?

  2. ROW_NUMBER gebruiken in sqlite

  3. Hoe kan ik verbinding maken met de Oracle Database 11g-server via ssh-tunnelketen (dubbele tunnel, server in bedrijfsnetwerk)?

  4. Kan geen instructies voor gegevensmanipulatie uitgeven met executeQuery()