полное внешнее объединение 3 таблиц с соответствующим индексом в Postgre SQL - PullRequest
2 голосов
/ 16 марта 2012

У меня SQL-запрос

SELECT * FROM A FULL OUTER JOIN B ON A.z = B.z WHERE A.z = 1 OR B.z = 1

где A.z и B.z - первичные ключи.

Цель состоит в том, чтобы выполнить полное внешнее объединение двух таблиц, в то время как их первичные ключи соответствуют заданному значению - так что возвращается только одна строка.

Но я запутался, как расширить его до 3 или более таблиц. Остается ограничение на то, что их первичные ключи соответствуют заданному индексу, так что всего возвращается только одна строка. Как ты это делаешь?

1 Ответ

10 голосов
/ 16 марта 2012

Во-первых, обратите внимание, что в предоставленном запросе FULL OUTER JOIN, который вы запрашиваете, может быть переписан как:

         SELECT *
           FROM (SELECT * FROM A WHERE z = 1) A
FULL OUTER JOIN (SELECT * FROM B WHERE z = 1) B ON A.z = B.z

, что делает (IMO) более ясным, что источники данных и каково условие соединенияявляется.На мгновение, с вашим WHERE состоянием, у меня возникло ощущение, что вы на самом деле хотите ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

С этим вы можете расширяться легче, вероятно:

         SELECT *
           FROM (SELECT * FROM A WHERE z = 1) A
FULL OUTER JOIN (SELECT * FROM B WHERE z = 1) B ON A.z = B.z
FULL OUTER JOIN (SELECT * FROM C WHERE z = 1) C ON COALESCE(A.z,B.z) = C.z
FULL OUTER JOIN (SELECT * FROM D WHERE z = 1) D ON COALESCE(A.z,B.z,C.z) = D.z
...