【问题标题】:Display missing rows (oracle, sql)显示缺失的行(oracle、sql)
【发布时间】:2019-04-10 15:29:42
【问题描述】:

我已经在下面运行了选择:

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 行?

【问题讨论】:

  • 添加一些说明问题的示例表数据 - 作为格式化文本,而不是图像。随意最小化,也许是 4 和 3 行而不是 15 和 12 行。

标签: sql oracle replace oracle12c contains


【解决方案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;

【讨论】:

  • 我的第一个查询返回唯一的,从第二个查询我可以得到更少,这没关系。但是如何找到没有成立的呢?
  • @4est 一种方法是使用反连接,q.v。我更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2014-06-07
  • 2018-02-07
  • 2016-08-31
  • 2021-10-19
相关资源
最近更新 更多