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

PostgreSQL:Използването на оператор AND в LEFT JOIN не работи според очакванията

Объркването около LEFT JOIN и WHERE клауза е изяснена много пъти:

Този интересен въпрос остава:

В Postgres няма изрични съвети за заявки. (Което е въпрос на продължаващ дебат.) Но все още има различни трикове, за да накарате Postgres да се огъва по ваш път.

Но първо се запитайте: Защо планиращият заявки е преценил, че избраният план е по-евтин в началото? Конфигурацията на вашия сървър по принцип нормална ли е? Настройките на разходите са подходящи? autovacuum бягане? Версията на Postgres е остаряла? Заобикаляте ли основен проблем, който наистина трябва да бъде отстранен?

Ако принудите Postgres да го направи по вашия начин, трябва да сте сигурни, че няма да задейства обратно, след надграждане на версията или актуализиране на конфигурацията на сървъра ... По-добре е да знаете какво точно правите.

Това каза, че можете принуди Postgres да "филтрира някои записи, преди да направи JOIN " с подзаявка, където добавяте OFFSET 0 - което е просто шум, логично, но не позволява на Postgres да го пренареди във формата на редовно съединение. (Все пак съвет за заявка)

SELECT la.listing_id, la.id, lar.*
FROM  (
   SELECT listing_id, id
   FROM   la
   WHERE  listing_id = 2780
   OFFSET 0
   ) la
LEFT   JOIN lar  ON lar.application_id = la.id;

Или можете да използвате CTE (по-малко неясен, но по-скъп). Или други трикове като задаване на определени конфигурационни параметри. Или в този конкретен случай бих използвал LATERAL присъединете се към същия ефект:

SELECT la.listing_id, la.id, lar.*
FROM   la
LEFT  JOIN LATERAL (
   SELECT *
   FROM   lar
   WHERE  application_id = la.id
   )  lar ON true
WHERE  la.listing_id = 2780;

Свързани:

Ето един обширен блог за подсказки за заявки от 2ndQuadrant. Пет годишен, но все още валиден.



  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 с Entity Framework (C#)

  2. Как да прекъсна връзките TCP/IP чрез keepalive postgreSQL, без да променям нищо в регистъра?

  3. pg_restore:[архиватор] неподдържана версия (1.13) в заглавката на файла

  4. Релсите търсят нагоре чрез сериализиран масив

  5. Postgresql - връща целия ред като масив