sql >> Databáze >  >> RDS >> PostgreSQL

Jaký typ JOIN použít

Je zřejmé, že máte duplicitní hodnoty pro oba spojovací sloupce. Místo kartézského součinu [INNER] JOIN chcete, aby byl každý řádek použit pouze jednou . Toho lze dosáhnout přidáním čísla řádku (rn ) za duplikát a připojte se na rn navíc.

Každá tabulka může mít více nebo méně dup za stejnou hodnotu než druhá, pokud nemáte zavedena další omezení (jako omezení FK) – ale ve vaší otázce nic není. Chcete-li zachovat vše řádky by použily FULL [OUTER] JOIN . Ale ve výsledku chcete zachovat 10 000 záznamů, což je mohutnost table2 . Musí to být tedy LEFT [OUTER] JOIN na table1 (se 40 řádky) - a vyloučit možné nadměrné řádky z 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;

Funguje pro Postgres nebo SQL Server. MySQL nepodporuje funkce oken, budete potřebovat náhradu:

  • Poslední záznam SQL SELECT bez omezení

Aby bylo jasno:LEFT JOIN je jen zkratka pro LEFT OUTER JOIN , takže již používáte vnější spojení. Vaše prohlášení je nedorozumění :

Používám sestavy ZOHO, které nepodporují vnější spojení.



  1. Nelze vyřešit konflikt řazení

  2. Chyba Oracle instantclient DYLD_LIBRARY_PATH

  3. Funkce NLS_CHARSET_NAME() v Oracle

  4. Jak zaokrouhlit časové razítko v MySQL