【问题标题】:Get Records from 'in' query list which are not present in table从“in”查询列表中获取表中不存在的记录
【发布时间】:2018-04-04 15:08:42
【问题描述】:

我在 oracle 11g 中使用具有大约 500 条记录的 'in' 子句的查询,有没有办法从表中不存在值的 'in' 子句中获取记录。

示例:

查询:

从名称所在的表中选择 * ('尼克','汤姆','露西','哈利','拉菲尔');

样本表:

在上表中,'TOM'、'HARRY'、'RAFEL' 的记录不存在于 in 子句中的表中,因此输出应为:

TOM

HARRY

RAFEL

【问题讨论】:

  • 我不清楚您的确切问题是什么。使用不在?
  • 我不想从表中获取记录,我想从表中不存在的 in 子句中的名称中获取记录。
  • 您必须将 'NICK'、'TOM'、'LUCY'、'HARRY'、'RAFEL' 的超集放入某个表或 CTE 中

标签: sql oracle


【解决方案1】:

您可以使用您要查找的值声明一个集合,然后与您的参考表执行连接以搜索不匹配的记录:

with cte_in as  (
select 'NICK' nickname from dual
union all select 'TOM' from dual
union all select 'LUCY' from dual
union all select 'HARRY' from dual
union all select 'RAFEL' from dual
)
SELECT    nickname 
FROM      cte_in cte
LEFT JOIN mytable mt
       ON cte.nickname = mt.NAME
WHERE     mt.NAME IS NULL 

其他解决方案是使用MINUS

SELECT nickname
FROM   cte_in
minus
select name 
from   mytable

编辑:另一种接近IN 格式的解决方案

WITH cte_in
     AS ( SELECT ( column_value ).getstringval() nickname
          FROM   XMLTABLE('"NICK","TOM","LUCY","HARRY","RAFEL"') ) 
SELECT *
FROM   cte_in
minus
SELECT NAME
FROM   mytable; 

见小提琴:http://sqlfiddle.com/#!4/679ae/11

【讨论】:

  • 这里的“in”查询在哪里?您需要使用“in”查询。
  • 最简单/最快的方法似乎是将所有值插入表内的IN,然后执行minusouter join。如果有其他适合需要的解决方案,没有理由绝对尝试使用IN 子句
  • 但问题要求使用“in”查询。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2017-11-03
  • 2023-03-26
相关资源
最近更新 更多