全外连接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个或更多的表。主键与给定索引相匹配的限制,以便总共只剩下一行返回。你怎么做呢?
答
首先要注意的是,在提供的查询,你要求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