在使用where子句后,如果有人不匹配join子句,有人知道如何返回null的行吗?
我有两个表,分别称为A和B。
示例:
TABLE A TABLE B
COL1 COL2 COL1 COL2 COL3 COL 4
A 1 A 1 sd 01/02
B 2 B 2 aa 01/05
C 3 C 3 bb 01/07
我使用以下查询:
SELECT *
FROM TABLE A as a
LEFT JOIN TABLE B as b ON a.COL1 = b.COL1 AND a.COL2 = b.COL2
我得到的结果是
COL1 COL2 COL1.2 COL2.2 COL3 COL4
A 1 A 1 sd 01/02
B 2 B 2 aa 01/05
C 3 C 3 bb 01/07
现在,当我添加此where子句时:
SELECT *
FROM TABLE A as a
LEFT JOIN TABLE B as b ON a.COL1 = b.COL1 AND a.COL2 = b.COL2
WHERE COL4 >= '01/05'
我明白了:
COL1 COL2 COL1.2 COL2.2 COL3 COL4
B 2 B 2 aa 01/05
C 3 C 3 bb 01/07
我的问题是如何获取查询以代替此显示:
COL1 COL2 COL1.2 COL2.2 COL3 COL4
A NULL NULL NULL NULL NULL
B 2 B 2 aa 01/05
C 3 C 3 bb 01/07
任何帮助或想法将不胜感激。
谢谢
答案 0 :(得分:0)
有一个奇怪的请求吗?我可以问一下,当where子句明确声明要排除NULL值时,为什么要将行返回为NULL吗?如果可以提供更多详细信息,我可以帮助您找到更好的方法。
答案 1 :(得分:0)
您将不得不对包含COL1
的唯一值的表使用外部联接。如果没有这样的表格,则可能会使用CTE:
with categories as (
select distinct col1
from a)
select categories.col1, a.col2, b.col1, b.col2, b.col3, b.col4
from categories
left outer join
(a join b on a.col1 = b.col1 and a.col2 = b.col2 and b.col4 >= '01/05')
on categories.col1 = a.col1
魔术在嵌套连接中。该联接中提供了原始查询,但是如果您需要除所有具有值的COL1
值之外的所有遗漏值,则需要将原始查询与有效COL1
值的列表联接起来。因此,该语句使用公用表表达式(CTE),即with
子句,并使用左外部联接将其与原始查询联接,即嵌套联接。
附加说明,OUTER
是不必要的,因为在指定连接类型LEFT
,RIGHT
或FULL
时隐含了这一点,我只是想明确一点
答案 2 :(得分:0)
只需将条件移至on
子句。它在left join
的第二个表上:
SELECT *
FROM TABLE A a LEFT JOIN
TABLE B b
ON a.COL1 = b.COL1 AND a.COL2 = b.COL2 and b.COL4 >= '01/05';