如何在多个案例中进行 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
假设我有这两个 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