Sql 如何在oracle CASE WHEN语句中查找重复记录

Sql 如何在oracle CASE WHEN语句中查找重复记录,sql,oracle,duplicates,case-when,Sql,Oracle,Duplicates,Case When,我有两张像下面这样的桌子。表A和表B。我们在TRANS_ID上进行外部连接,并比较两个表 我希望得到结果中所示的结果。我们仅检查表A中的重复项,即基于表A.TRANS_ID TABLEA +------+----------+-------+--+-------------+ | UUID | TRANS_ID | NAME | | PHONENUMBER | +------+----------+-------+--+-------------+ | 123 | 7928 | S

我有两张像下面这样的桌子。表A和表B。我们在TRANS_ID上进行外部连接,并比较两个表

我希望得到结果中所示的结果。我们仅检查表A中的重复项,即基于表A.TRANS_ID

TABLEA
+------+----------+-------+--+-------------+
| UUID | TRANS_ID | NAME  |  | PHONENUMBER |
+------+----------+-------+--+-------------+
|  123 |     7928 | SCOTT |  | 87482837849 |
|  123 |     7928 | SCOTT |  | 87482837849 |
|  489 |     7493 | TOM   |  | 79274778397 |
|  827 |     7920 | DAVID |  | 23794928749 |
|  324 |     8472 | PAT   |  | 87927478839 |
+------+----------+-------+--+-------------+

TABLEB
+----------+----------+--------+-------------+
| BATCH_ID | TRANS_ID | SENDER | PHONENUMBER |
+----------+----------+--------+-------------+
|   823784 |     7438 | LSK    | 84748394092 |
|   793847 |     7493 | KLI    | 79274778397 |
|   748738 |     7920 | ISL    | 74892890487 |
+----------+----------+--------+-------------+

RESULT
+----------+-------------+-------------------------+
| TRANS_ID | PHONENUMBER |           STATUS        |
+----------+-------------+-------------------------+
|     7928 | 87482837849 |    DUPLICATE RECORD     |
|     7928 | 87482837849 |    NOT IN TABLEB        |
|     7438 | 84748394092 |    NOT IN TABLEA        |
|     7920 | 23794928749 |    PHONENUMBER MISMATCH |
|     8472 | 87927478839 |    NOT IN TABLEB        |
+----------+-------------+-------------------------+
我尝试使用下面的case语句。我涵盖了所有场景,除了提取副本。如果表A中存在重复记录,但表B中不存在,则第一条记录应为“不在表B中”,后续记录应为“重复记录”

 CASE
          WHEN TABLEA.TRANS_ID is null THEN 'NOT IN TABLEA'
          WHEN TABLEB.TRANS_ID is null THEN 'NOT IN TABLEB' 
          WHEN decode(TABLEA.PHONENUMBER,ALRAJHI_TABLEB.PHONENUMBER,1,0)=0 THEN 'PHONENUMBER MISMATCH'             
          END
这里有一种方法:

WITH x
     AS (SELECT ROW_NUMBER()
                  OVER (
                    PARTITION BY CASE WHEN a.trans_id IS NULL THEN b.trans_id ELSE a.trans_id END
                    ORDER BY CASE WHEN a.trans_id IS NULL THEN b.trans_id ELSE a.trans_id END) AS rn,
                CASE WHEN a.trans_id IS NULL THEN b.trans_id ELSE a.trans_id END AS trans_id,
                CASE WHEN a.trans_id IS NULL THEN b.phonenumber ELSE a.phonenumber END AS phonenumber,
                CASE
                     WHEN a.trans_id IS NULL THEN 'NOT IN TABLEA'
                     WHEN b.trans_id IS NULL THEN 'NOT IN TABLEB'
                     WHEN DECODE(a.phonenumber, b.phonenumber, 1, 0) = 0 THEN 'PHONENUMBER MISMATCH'
                END AS status
         FROM   tablea a
                FULL OUTER JOIN tableb b
                             ON a.trans_id = b.trans_id),
y AS (
SELECT trans_id,
       phonenumber,
       CASE WHEN rn > 1 THEN 'DUPLICATE RECORD' ELSE status END AS status
FROM   x)
SELECT * FROM y
WHERE  status IS NOT NULL -- Exclude TableA records that are (presumably) OK

编辑:调整查询以使用第二个CTE y as NOT NULL筛选器,状态为删除行号检查所需的行。

我想我可以使用union all从第一个表中引入重复项:

select trans_id, coalesce(ta.phonenumber, tb.phonenumber) as phonenumber,
       (case when ta.phonenumber is null then 'NOT IN TABLEA'
             when tb.phonenumber is null then 'NOT IN TABLEB'
             else 'PHONENUMBER MISMATCH'
        end) as status
from (select distinct trans_id, phonenumber
      from tablea ta
     ) ta full join
     tableb tb
     using (trans_id)
where ta.phonenumber is null or tb.phonenumber is null or
      ta.phonenumber <> tb.phonenumber
union all
select trans_id, phonenumber, 'DUPLICATE RECORD'
from tablea
group by trans_id, phonenumber
having count(*) >= 2;

为什么对于trans_id=7928,一行显示重复记录,一行不在表B中?如果您说TABLEA是主表,那么TABLEA.TRANS_ID为null的条件对我来说没有意义?对不起,这不是这两者之间的父子关系。有两个表包含一些数据,可能的情况是表A中可能存在记录,但表B中不存在记录,反之亦然。为了比较重复项,我们只检查表A中的trans_id,不检查表B中的trans_id。我建议您提供完整的SQL查询,而不仅仅是案例部分和当前得到的结果,为了更好地理解您的问题。您是否使用了完整的外部联接?似乎您只需要将ELSE的重复记录作为最后一种情况。这非常有效,但问题是当TABLEA TRANS_ID“7928”中的一条/两条记录都在TABLEB中时,我没有在结果中得到“重复记录”。你可以用我在上创建的小提琴上提供的样本数据检查结果。对于Trans_ID 7928,第一个条目显示“不在表B中”,而当rn>1条件被标记为“重复记录”时,案例拾取的第二个条目。也许你可以在小提琴中尝试一些额外的数据,看看你是否可以演示/再现你遇到的问题?你能检查一下我的小提琴吗?我在表a和表B中都有这个记录7928,但它在表a中是重复的。它不会在结果中显示为重复项,因为该记录根本不会出现@拉杰,谢谢你的例子。我已经修改了查询以处理这种情况。很抱歉,我会继续讨论这个问题。这个修正是可行的,但是当我有这个场景时,就像这里的例子一样。我得到了8张带有“重复记录”标志的记录。事实上,我应该只得到三张trans_id 7928的唱片,对吗?