【问题标题】:How to LEFT JOIN with multiple cases如何 LEFT JOIN 与多个案例
【发布时间】:2021-12-24 14:56:36
【问题描述】:

假设我有这两个表:

表格:tab1

valA valB valC valD
1 11 111 A
2 11 333 A
3 44 444 B
3 66 666 D

表格:tab2

val1 val2 val3 val4
1 11 111 A
1 22 222 A
2 44 333 B
3 55 555 A
3 66 666 D

我有 3 个案例与 UNION 联合起来。这是代码:

WITH tog AS
(

SELECT* FROM tab1
INNER JOIN tab2
ON ValA = Val1
AND ValB = Val2 

UNION

SELECT* FROM tab1
INNER JOIN tab2
ON ValA = Val1
AND ValB <> Val2  
AND ValD = Val4

UNION

SELECT* FROM tab1
INNER JOIN tab2
ON ValA = Val1
AND ValC = Val3
AND ValD <> Val4
)

结果是:

表格:tog

valA valB valC valD val1 val2 val3 val4
1 11 111 A 1 11 111 A
1 11 111 A 1 22 222 A
2 33 333 a 2 44 444 B
3 66 666 D 3 66 666 D

所以,我需要 tab1 的表格,但 没有 匹配项,例如:

valA valB valC valD val1 val2 val3 val4
3 44 444 B

我尝试过这样的事情,但我知道这是完全错误的:

SELECT * FROM tab1
LEFT JOIN tog
ON tab1.valA = tog.val1
WHERE tog.val1 IS NULL

我对 SQL 还很陌生,所以如果有任何提示和建议,我将不胜感激。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    您想从 tab1 中选择数据,而 tab2 中不存在匹配项。

    select *
    from tab1
    where not exists
    (
      select null
      from tab2
      where tab1.vala = tab2.val1
      and 
      ( 
        (tab1.valb = tab2.val2) or
        (tab1.vald = tab2.val4 and tab1.valb <> tab2.val2) or
        (tab1.valc = tab2.val3 and tab1.vald <> tab2.val4)
      )
    );
    

    或者,如果您需要空的 tab2 列:

    select *
    from tab1
    left outer join tab2
      on tab1.vala = tab2.val1
      and 
      ( 
        (tab1.valb = tab2.val2) or
        (tab1.vald = tab2.val4 and tab1.valb <> tab2.val2) or
        (tab1.valc = tab2.val3 and tab1.vald <> tab2.val4)
      )
    )
    where tab2.val1 is null; -- dismiss the matches
    

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多