2012-03-16 79 views
0

匹配索引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個或更多的表。主鍵與給定索引相匹配的限制,以便總共只剩下一行返回。你怎麼做呢?

+0

如果你只想要一個行回來,那是一個完全外部聯接你在找什麼?完整的外連接返回來自兩個表的所有行,並且如果不匹配,則將爲該鍵放置空值。 – jle 2012-03-16 16:32:54

+0

請告訴我們關於你的數據約束的一些事情(或者寫一個例子),因爲第一個查詢可能會返回很多很多的任意數據行...... – Aprillion 2012-03-16 16:34:10

+0

@jle這個想法是,如果3個表中的任何一個都有一行對於給定的密鑰,我想要它。 – Aman 2012-03-16 16:34:34

回答

8

首先要注意的是,在提供的查詢,你要求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 
+0

嘿,我在這個問題上犯了一個錯誤。你可以重新看看嗎?另外,如果B,C中的行與B.z = C.z存在但A中沒有對應的行存在,該怎麼辦? – Aman 2012-03-16 16:38:06

+0

@Aman:修改答案。 – Benoit 2012-03-16 16:40:53

+0

這不起作用,因爲A與B連接,A也與C連接,但B和C之間沒有同時連接。試圖找出A沒有z = 1的行,但B和C做的情況。有兩行而不是一行。 – Aman 2012-03-16 16:49:31