SQL Join 而不是 UNION
SQL 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
我想要一个 select 查询来获取下面的值
----------------------------------
ZID | NAME | VALUE1 | VALUE2
----------------------------------
1 | Test | A | null
1 | Test | B | null
1 | Test | null | C
1 | Test | null | D
我可以通过在每个 select 中伪造一列来使用 UNION
实现上述目标,如下所示。
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
)
);
是否可以使用 JOINS 在单个 select 中检索上述数据?我曾尝试使用左连接,但是,我最终在结果中得到了数据的笛卡尔积。
查询将类似于:
SELECT ZID, NAME, VALUE1, VALUE2
FROM T1, C1, S1;
联合会给你更多的行。加入会给你更多的专栏。如果你想连接它们以获得一组包含所有列的行,你需要指定哪些行放在一起。例如,如果您没有指定哪个 C1 行与哪个 S1 行匹配,它会将每个行与所有行匹配,并给出您不想要的产品。
在on子句中定义关系,它会做你想做的。
您可以使用:
select t1.*, c1.value1, s1.value2
from c1 full join
s1
on false join
t1
on t1.id in (c1.id, s1.id)
false
上的 full join
很像 union all
。
您需要 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
我有以下表格:
Table T1
--------------------------
ZID | NAME
------------------------
1 | Test
Table C1
--------------------------
ZID | VALUE1
------------------------
1 | A
1 | B
Table S1
--------------------------
ZID | VALUE2
------------------------
1 | C
1 | D
我想要一个 select 查询来获取下面的值
----------------------------------
ZID | NAME | VALUE1 | VALUE2
----------------------------------
1 | Test | A | null
1 | Test | B | null
1 | Test | null | C
1 | Test | null | D
我可以通过在每个 select 中伪造一列来使用 UNION
实现上述目标,如下所示。
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
)
);
是否可以使用 JOINS 在单个 select 中检索上述数据?我曾尝试使用左连接,但是,我最终在结果中得到了数据的笛卡尔积。
查询将类似于:
SELECT ZID, NAME, VALUE1, VALUE2
FROM T1, C1, S1;
联合会给你更多的行。加入会给你更多的专栏。如果你想连接它们以获得一组包含所有列的行,你需要指定哪些行放在一起。例如,如果您没有指定哪个 C1 行与哪个 S1 行匹配,它会将每个行与所有行匹配,并给出您不想要的产品。
在on子句中定义关系,它会做你想做的。
您可以使用:
select t1.*, c1.value1, s1.value2
from c1 full join
s1
on false join
t1
on t1.id in (c1.id, s1.id)
false
上的 full join
很像 union all
。
您需要 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