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