全外连接3代表与Postgre SQL

问题描述:

匹配索引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

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