比较 Oracle 中具有某些 null 值的两个表之间的数据

Comparing data between two tables in Oracle with some null values

提问人:user3122166 提问时间:1/21/2023 更新时间:1/21/2023 访问量:135

问:

我有两个表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
              

我的查询有什么问题?

SQL Oracle

评论

0赞 Thorsten Kettner 1/21/2023
您希望确切地显示哪些 TableA 行?看起来您首先在 TableB 中查找相同的 ID。这是正确的吗?因此,如果 TableB 中不存在该 ID,是否要显示 TableA 行?如果该 ID 存在,则比较名称和日期,如果其中一个或两个值不同,则要显示 TableA 行,是吗?
0赞 user3122166 1/21/2023
是的,正确,使用 MINUS 的答案对我来说是最好的答案

答:

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

您似乎希望在其中找到没有相应行的行,其中既匹配又匹配其中之一:名称匹配;日期匹配;或者 中的日期是,而 中的日期与默认值匹配。TableATableBidTableBNULLTableA

如果是这种情况,那么:

  • AND具有更高的优先级,因此与 so 相同,但您想要,因此您需要使用括号来更改优先级。ORX OR Y AND ZX OR (Y AND Z)(X OR Y) AND Z
  • 您想比较日期而不是=!=
  • 您想直接比较 s,而不是使用 和 另一个子查询。idIN
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 的答案对我来说效果很好