我有以下表格:
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 join
对false
的作用与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