1

我在 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

4

3 回答 3

1

你不能以你想要的方式。

您需要将要查找的值插入表中,然后选择所需表中不存在的所有值。

假设您要查找的数据位于其中,A并且您想知道哪些数据不存在于B.

SELECT *
FROM   table_a A
WHERE  NOT EXISTS (SELECT * 
                   FROM table_b B 
                   WHERE B.col1 = A.col1);
于 2013-02-07T16:33:54.963 回答
1

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;
于 2013-02-07T16:39:37.270 回答
0

如果您只是在特定示例中使用整数,这将是一种方法:

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

祝你好运。

于 2013-02-07T16:39:05.453 回答