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

SQL дублирани редове с множество леви съединения

Изпитвате обобщено отклонение в горната заявка.

Това се случва, защото има

  • съединяване 1-1 или 1-N между aaa &bbb
  • има 1-N съединение между bbb &ccc

Последното присъединяване създава M дубликати за редове, които съществуват в bbb ако са присъединени към M редове чрез съединение към ccc

За да коригирате грешката, разделете заявката на две CTE и обединете резултата.

WITH agg_bb AS (
SELECT aa.id, sum(bb.count)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
GROUP BY aa.id
)
, agg_cc AS (SELECT aa.id, count(DISTINCT cc.id)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
LEFT JOIN cccc cc ON cc.bb_id = bb.id
GROUP BY aa.id
)
SELECT * FROM agg_bb JOIN agg_cc USING (id)

Като цяло, за да избегнете разклонения, прилагайте агрегатни операции само към колоните от най-дясната релация в поредица от съединения. Ако установите, че събирате колони от средните таблици, разделете заявката, както направих по-горе. Само следните функции са инвариантни в разклонение:COUNT DISTINCT , MIN , MAX




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL и ActiveRecord подизбират за състояние на състезание

  2. Не може да се свърже с Postgres DB поради тип удостоверяване 10 не се поддържа

  3. Отместване на местната часова зона в PostgreSQL

  4. Възможно ли е да промените дизайна на таблицата на PostgreSQL с помощта на LibreOffice Base?

  5. SQL, присъединен към последната дата