postgreSQL Join instead of UNION



我有以下表格:

Table T1
--------------------------
ZID   | NAME 
------------------------
1     | Test 
Table C1 
--------------------------
ZID   | VALUE1 
------------------------
1     | A 
1     | B
Table S1 
--------------------------
ZID   | VALUE2 
------------------------
1     | C 
1     | D

我想要一个选择查询来获取以下值

----------------------------------
ZID   | NAME  | VALUE1  | VALUE2  
----------------------------------
1     | Test  |    A    |   null 
1     | Test  |    B    |   null 
1     | Test  |   null  |    C 
1     | Test  |   null  |    D

我能够通过使用UNION在每个select中伪造一个列来实现上述目标,如下所示。

SELECT
ZID,
NAME,
VALUE1,
NULL AS VALUE2
FROM
T1
LEFT JOIN C1 ON (
T1.ZID = C1.ZID
)
UNION ALL 
(
SELECT
ZID,
NAME,
NULL AS VALUE1,
VALUE2
FROM
T1
LEFT JOIN S1 ON (
T1.ZID = S1.ZID
)
);

是否有可能在使用join的单个选择中检索上述数据?我尝试过使用左连接,但是,我最终在结果中得到数据的笛卡尔积。

可以使用:

select t1.*, c1.value1, s1.value2
from c1 full join
s1
on false join
t1
on t1.id in (c1.id, s1.id)

Afull joinfalse的作用与union all非常相似。

查询将类似于:

SELECT ZID, NAME, VALUE1, VALUE2
FROM T1, C1, S1;

Union将为您提供更多行。Join将为您提供更多列。如果希望将它们连接起来,以获得一组包含所有列的行,则需要指定哪些行可以放在一起。例如,如果您不指定哪个C1行与哪个S1行对应,它将每个行与所有行匹配,并给出您不想要的结果。

在on子句中定义关系,它会做你想做的。

您需要UNION来添加行。您可以将连接放在UNION的外部,以避免必须执行两次:

SELECT
ZID,
NAME,
VALUE1,
NULL AS VALUE2
FROM
T1
LEFT JOIN (
SELECT ZID, VALUE1, NULL AS VALUE2
FROM C1
UNION ALL
SELECT ZID, NULL AS VALUE1, VALUE2
FROM S1 
) Merged ON T1.ZID = Merged.ZID