显示缺少的行(oracle,sql)

时间:2018-11-07 07:58:34

标签: sql oracle replace oracle12c contains

我已经在选择下面运行了

select replace(replace(id,'[',''),']','') as ID from tableA where COL1= 'TEST';

它返回 15行

example of id:

1abc
3def
9abc
..
..
..
14abc

然后我正在将该ID查找到其他表中

select col1, col3 from tableB where 
      id in (select replace(replace(id,'[',''),']','') from tableA where COL1= 'TEST');

它返回 12行。

1abc   city1
2def   city2
5abc   city2
..     ..
12abc  city3

如何显示缺少的3行?

1 个答案:

答案 0 :(得分:1)

我建议实际上没有丢失的行,但是,第一个查询返回的15个行中的3个实际上是重复的id值。

要查看其工作方式,请考虑第一个查询返回了以下5个id值(为简单起见):

1
1
1
2
2

实际上有5个id值,但实际上只有2个是唯一的。然后,下面的WHERE子句:

WHERE id IN (1, 1, 1, 2, 2)

等同于只是说:

WHERE id IN (1, 2)

另一种可能性是tableB并不包含第一个查询返回的每个id

要找到丢失的行,这是一种方法:

WITH cte AS (
    SELECT REPLACE(REPLACE(id, '[', ''), ']', '') AS ID
    FROM tableA
    WHERE COL1= 'TEST'
)

SELECT a.ID
FROM cte a
LEFT JOIN tableB b
    ON a.ID = b.ID
WHERE b.ID IS NULL;