如何在多个案例中进行 LEFT JOIN

How to LEFT JOIN with multiple cases

假设我有这两个 table:

Table: tab1

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

Table: 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
)

结果将是:

table: 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 的 table 但 没有 匹配项,例如:

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 的新手,所以我将不胜感激任何提示和建议。

您想 select 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