返回不在 Oracle 表中的提供值列表

Posted

技术标签:

【中文标题】返回不在 Oracle 表中的提供值列表【英文标题】:Return list of supplied values that are not in table in Oracle 【发布时间】:2019-12-23 03:58:24 【问题描述】:

下面有一个EMPLOYEE表

EPM_ID
------
1001
1002
1004

我有一个我想要验证的 EPM_ID 列表: (1000, 1001, 1002, 1003, 1004, 1005)

如何编写 仅 Oracle SQL 查询(不创建任何临时表) 以返回不在 EMPLOYEE 表中但在我的列表中的 EPM_ID 列表?例如,结果应该是 1000、1003、1005。

【问题讨论】:

【参考方案1】:

这样就可以了:

select EPM_IDs 
from
(
  select 1000 as EPM_IDs union 
  select 1001 union 
  select 1002 union 
  select 1003 union 
  select 1004 union 
  select 1005
)a
where not exists(select 1 from EMPLOYEE e where a.EPM_IDs = e.EPM_IDs)

【讨论】:

但是我有一个巨大的列表,列表中大约有 50,000 个元素。那个庞大的查询会运行吗? 我明白了,那个元素列表是在字符串还是表格中?你有什么形式的?【参考方案2】:

您可以使用connect by子句将您的列表转换为行,然后执行MINUS操作如下:

SQL> -- GENERATING SAME DATA AS YOUR TABLE
SQL> WITH YOUR_DATAA (EMPLOYEE_ID) AS
  2  (SELECT '1001' FROM DUAL UNION ALL
  3  SELECT '1002' FROM DUAL UNION ALL
  4  SELECT '1004' FROM DUAL),
  5  -- YOUR QUERY STARTS FROM HERE -- WITH
  6  YOUR_LIST (LST) AS
  7  (SELECT '1000, 1001, 1002, 1003, 1004, 1005' FROM DUAL)
  8  --
  9  SELECT TRIM(REGEXP_SUBSTR(LST, '[^,]+', 1, LEVEL)) AS EMPLOYEE_IDS
 10  FROM YOUR_LIST
 11  CONNECT BY LEVEL <= REGEXP_COUNT(LST, ',') + 1
 12  MINUS
 13  SELECT EMPLOYEE_ID
 14  FROM YOUR_DATAA;

EMPLOYEE_IDS
--------------------------------------------------------------------------------
1000
1003
1005

SQL>

干杯!!

【讨论】:

【参考方案3】:

您能否告诉我们您使用的 Oracle 数据库版本以及 Employee Table 的 DESC 命令的输出?

另外,请告诉我们您的表中的行数(即表中现有的行数)以及您尝试从中查找/未查找的员工 ID 列表的长度/大小你的桌子?

此外,您拥有的员工 ID 列表:它们是否存储在文件、另一个表或网页等中?好心提醒。

这将有助于进一步回答您的问题。

问候!

净土

【讨论】:

【参考方案4】:

所以,这是拯救我的一天的解决方案。 我在生产数据库中创建临时表时受到限制,这是解决此问题的简单而明显的解决方案。

SELECT column_value AS EMP_ID 
FROM   TABLE(sys.Odcinumberlist(1000, 1001, 1002, 1003, 1004, 1005)) 
MINUS 
SELECT emp_id 
FROM   employee 

说明 : table(sys.odcinumberlist(1000, 1001, 1002, 1003, 1004, 1005)) 将提供的值转换为具有名为 EMP_ID 的单列的表状结构,如下所示。然后对其应用正常的 SQL MINUS 操作。

EMP_ID
------
1000
1001
1002
1003
1004
1005

(注意 : sys.odcinumberlist() 有最多 999 个参数的限制)

现在不要问我 sys.odcinumberlist() 究竟在内部创建了什么。我不是数据库专业人士。请参考http://www.dba-oracle.com/t_advanced_sql_table_expressions.htm

【讨论】:

以上是关于返回不在 Oracle 表中的提供值列表的主要内容,如果未能解决你的问题,请参考以下文章

Access SQL 查询:返回值不在相关表的间隔之间

在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中

是否可以在 Oracle 中将表中的一行作为 DML(插入、更新)返回?

如何使用 SQL Server 返回不在表中的 id

T-SQL:如何在值列表中选择不在表中的值?