返回不在 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 表中的提供值列表的主要内容,如果未能解决你的问题,请参考以下文章
在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值
当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中