我在 oracle 中有这个查询:
select * from table where col2 in (1,2,3,4);
可以说我得到了这个结果
col1 | col2
-----------
a 1
b 2
我的 'in (1,2,3,4)' 部分有 20 个或更多选项,我如何确定在我的表中找不到哪些值?在我的示例中,表中不存在 3 和 4
你不能以你想要的方式。
您需要将要查找的值插入表中,然后选择所需表中不存在的所有值。
假设您要查找的数据位于其中,A
并且您想知道哪些数据不存在于B
.
SELECT *
FROM table_a A
WHERE NOT EXISTS (SELECT *
FROM table_b B
WHERE B.col1 = A.col1);
IN 列表是愚蠢的,或者至少不是很有用。改为使用 SQL 类型集合来存储您的值,因为我们可以将它们转换为表。
在这个例子中,我使用了不起眼的 SYS.KU$_OBJNUMSET 类型,这是我所知道的 10g 上唯一的 Number 嵌套表。(11g 中还有更多内容)。
所以
select t.column_value
from table ( SYS.KU$_OBJNUMSET (1,2,3,4) ) t
left join your_table
on col2 = t.column_value
where col2 is null;
如果您只是在特定示例中使用整数,这将是一种方法:
SELECT *
FROM (
Select Rownum r
From dual
Connect By Rownum IN (1,2,3,4)
) T
LEFT JOIN YourTable T2 ON T.r = T2.Col2
WHERE T2.Col2 IS NULL
还有小提琴。
这会根据您的 where 条件 1、2、3、4 创建一个表格并将其用于LEFT JOIN
打开。
- 编辑
因为值不是整数,所以这是另一个“丑陋”的选项:
SELECT *
FROM (
Select 'a' r From dual UNION
Select 'b' r From dual UNION
Select 'c' r From dual UNION
Select 'd' r From dual
) T
LEFT JOIN YourTable T2 ON T.r = T2.Col2
WHERE T2.Col2 IS NULL
http://www.sqlfiddle.com/#!4/5e769/2
祝你好运。