提问人:user3122166 提问时间:1/21/2023 更新时间:1/21/2023 访问量:135
比较 Oracle 中具有某些 null 值的两个表之间的数据
Comparing data between two tables in Oracle with some null values
问:
我有两个表TableA和TableB,我也想比较一些列的数据,并发现名称和日期列等差异。我尝试了有和没有 nvl
数据样本
TableA
id | name | date
1 | test a | 29-01-2019
TableB
id | name | date
1 | test abc | <null>
select a.id, a.name, a.date from TableA a
where NOT EXISTS (select 1 from TableB b
where a.name = b.name OR a.date != nvl(b.date, to_date('01-01-2299', 'dd-mm-yyyy')))
AND a.id IN (select id from TableB)
此查询
的结果 无结果为空
期待这样的结果
id | name | date
1 | test a | 29-01-2019
我的查询有什么问题?
答:
1赞
Sergey
1/21/2023
#1
select a.id,a.name,a.date
from tablea a
minus
select b.id,b.name,b.date
from tableb b
评论
0赞
Thorsten Kettner
1/21/2023
我很少对纯代码答案投赞成票。但这个解决方案很可能是他们正在寻找的,也是针对该任务的最简单查询。
0赞
MT0
1/21/2023
#2
您似乎希望在其中找到没有相应行的行,其中既匹配又匹配其中之一:名称匹配;日期匹配;或者 中的日期是,而 中的日期与默认值匹配。TableA
TableB
id
TableB
NULL
TableA
如果是这种情况,那么:
AND
具有更高的优先级,因此与 so 相同,但您想要,因此您需要使用括号来更改优先级。OR
X OR Y AND Z
X OR (Y AND Z)
(X OR Y) AND Z
- 您想比较日期而不是
=
!=
- 您想直接比较 s,而不是使用 和 另一个子查询。
id
IN
SELECT a.id,
a.name,
a."DATE"
FROM TableA a
WHERE NOT EXISTS (
SELECT 1
FROM TableB b
WHERE ( a.name = b.name
OR a."DATE" = COALESCE(b."DATE", DATE '2299-01-01')
)
AND a.id = b.id
)
其中,对于示例数据:
CREATE TABLE TableA (id, name, "DATE") AS
SELECT 1, 'test a', DATE '2019-01-29' FROM DUAL;
CREATE TABLE TableB (id, name, "DATE") AS
SELECT 1, 'test abc', CAST(NULL AS DATE) FROM DUAL;
输出:
编号 | 名字 | 日期 |
---|---|---|
1 | 测试一个 | 2019-01-29 00:00:00 |
评论
0赞
user3122166
1/21/2023
非常感谢,使用 MINUS 的答案对我来说效果很好
评论