2012-03-20 53 views
1

我想从这个not in查询转换为not exists转换不是不存在

select id, name, cat from posts where id not in (1, 100) 

我怎么变成一个不存在

+0

只是好奇......你为什么需要这样做?看来你目前的查询没问题。 – everton 2012-03-20 20:59:22

+0

当我使用NOT IN我的查询需要9分钟。当我删除NOT IN需要13秒。只是想看看不存在会有所作为 – Luke101 2012-03-20 21:07:28

+3

另外:确保'id'被索引。 – IAbstract 2012-03-20 21:09:00

回答

3
SELECT id, 
     NAME, 
     cat 
FROM posts p 
WHERE NOT EXISTS (SELECT 1 
        FROM (SELECT 1 AS col 
          FROM dual 
          UNION 
          SELECT 100 AS col 
          FROM dual) a 
        WHERE p.id = a.col); 

您当前的查询是好的,但仍然如果您想使用NOT EXISTS,请尝试此操作。

+0

这是怎么回事?你忽略了'100',你没有别名'col'所以这不起作用 – Ben 2012-03-20 21:04:56

+3

这是Oracle的存在主义吗? ;) – 2012-03-20 21:06:13

+0

现在它工作Mr.Ben :) – Teja 2012-03-20 21:11:44

3

你并不需要这种转换。如果您使用的是子查询,而不是硬编码的值列表,则not exists将是合适的。

您当前的查询很好。