【发布时间】:2021-01-10 08:20:42
【问题描述】:
我有两张如下表。 TABLEA 和表 TABLEB。我们对 TRANS_ID 进行外连接并比较两个表。
我想得到结果中显示的结果。我们仅检查 TABLEA 中的重复项(即,基于 TABLEA.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 when 语句。除了提取重复项外,我涵盖了所有场景。当 TABLE A 中存在重复记录且 TABLEB 中不存在重复记录时,第一条记录应为“NOT IN TABLEB”,后续记录应为“DUPLICATE RECORD”
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
【问题讨论】:
-
为什么
trans_id = 7928一行显示DUPLICATE RECORD和一行NOT IN TABLEB?如果您说TABLEA是主表,那么条件TABLEA.TRANS_ID is null对我来说没有意义? -
对不起,这不是这两者之间的父子关系。有两个表有一些数据,可能的情况是表A中可以存在记录,但表B中不存在记录,反之亦然。只是为了比较重复项,我们只检查表 A 中的 trans_id 而不是表 B 中的。
-
我建议您提供完整的 SQL 查询(而不仅仅是 CASE 部分)和您得到的当前结果,以帮助更好地了解您的问题。
-
你使用
FULL OUTER JOIN吗? -
看来你只需要
ELSE 'DUPLICATE RECORD作为最后一种情况。
标签: sql oracle duplicates case-when