PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jakiego typu JOIN użyć

Oczywiście masz zduplikowane wartości dla obu łączących się kolumn. Zamiast produktu kartezjańskiego [INNER] JOIN dałoby to, chcesz, aby każdy wiersz był używany tylko raz . Możesz to osiągnąć, dodając numer wiersza (rn ) za duplikat i dołącz do rn dodatkowo.

Każda tabela może mieć więcej lub mniej duplikatów dla tej samej wartości niż druga, chyba że masz dodatkowe ograniczenia (takie jak ograniczenie FK) - ale nie ma nic w twoim pytaniu. Aby zachować wszystkie wiersze, w których można by użyć FULL [OUTER] JOIN . Ale chcesz zachować 10000 rekordów w wyniku, co odpowiada liczności table2 . Więc musi to być LEFT [OUTER] JOIN na table1 (z 40 wierszami) - i wyklucz możliwe nadmiarowe wiersze 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;

Działa dla Postgres lub SQL Server. MySQL nie obsługuje funkcji okien, potrzebujesz zamiennika:

  • Ostatni wpis SQL SELECT bez ograniczeń

Aby było jasne:LEFT JOIN to tylko skrót od LEFT OUTER JOIN , więc używasz już sprzężenia zewnętrznego. Twoje oświadczenie to nieporozumienie :

Używam raportów ZOHO, które nie obsługują złączeń zewnętrznych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nie można usunąć obiektu z powodu ograniczenia klucza obcego

  2. Jak znaleźć rozmiar dysku tabeli Postgres / PostgreSQL i jej indeksy?

  3. Policz liczbę dni między 2 datami w JPA

  4. Analiza porównawcza zarządzanych rozwiązań chmurowych PostgreSQL — część pierwsza:Amazon Aurora

  5. Jak uniknąć wielu ewaluacji funkcji za pomocą składni (func()).* w zapytaniu SQL?