PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Какъв тип JOIN да използвате

Очевидно имате дублиращи се стойности и за двете присъединяващи се колони. Вместо декартовия продукт [INNER] JOIN би произвел за това, искате всеки ред да се използва само веднъж . Можете да постигнете това, като добавите номер на ред (rn ) за дубликат и се присъединете на rn допълнително.

Всяка таблица може да има повече или по-малко дубъли за същата стойност от другата, освен ако нямате допълнителни ограничения (като FK ограничение) - но във вашия въпрос няма нищо. За да запазите всички редове един би използвал FULL [OUTER] JOIN . Но вие искате да запазите 10 000 записа в резултата, което е кардиналността на table2 . Така че трябва да е LEFT [OUTER] JOIN на table1 (с 40 реда) - и изключете възможни прекомерни редове от 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;

Работи за Postgres или SQL Server. MySQL не поддържа прозоречни функции, ще ви е необходим заместител:

  • SQL SELECT последен запис без ограничение

За да е ясно:LEFT JOIN е просто стенография за LEFT OUTER JOIN , така че вече използвате външно присъединяване. Вашето твърдение е недоразумение :

Използвам ZOHO отчети, които не поддържат външни присъединявания.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получа броя на неделята на текущия месец в psql?

  2. Предаване на множество стойности в един параметър

  3. Общ преглед на PostgreSQL кеширане на заявки и балансиране на натоварването

  4. Работи се към Postgres-XL 9.5

  5. Как да зададете потребителска парола по подразбиране в PostgreSQL