匹配索引I有一個SQL查詢全外連接3代表與Postgre 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個或更多的表。主鍵與給定索引相匹配的限制,以便總共只剩下一行返回。你怎麼做呢?
匹配索引I有一個SQL查詢全外連接3代表與Postgre 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個或更多的表。主鍵與給定索引相匹配的限制,以便總共只剩下一行返回。你怎麼做呢?
首先要注意的是,在提供的查詢,你要求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
條件下,我感覺你實際上想要一個INNER 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
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
如果你只想要一個行回來,那是一個完全外部聯接你在找什麼?完整的外連接返回來自兩個表的所有行,並且如果不匹配,則將爲該鍵放置空值。 – jle 2012-03-16 16:32:54
請告訴我們關於你的數據約束的一些事情(或者寫一個例子),因爲第一個查詢可能會返回很多很多的任意數據行...... – Aprillion 2012-03-16 16:34:10
@jle這個想法是,如果3個表中的任何一個都有一行對於給定的密鑰,我想要它。 – Aman 2012-03-16 16:34:34