这个查询可以优化吗?

时间:2011-05-20 19:54:00

标签: sql oracle

 ColumnA   ColumnB
    1         0
    2         0
    2         1
    2         2
    3         0
    3         0

下面的查询可以优化吗?

SELECT DISTINCT ColumnA 
  FROM TABLE 
 WHERE ColumnA NOT IN (SELECT ColumnA 
                         FROM TABLE
                        WHERE ColumnB = 2)
   AND ColumnB = 0

这应该返回1和3.

我想从ColumnA中选择不同的值,但前提是ColumnB中的值等于0 ...并且ColumnB中没有值等于2.是否有更优化的方法来重写它?

5 个答案:

答案 0 :(得分:3)

你可以试试这个:

SELECT DISTINCT a.ColumnA 
  FROM TABLE a 
 WHERE a.CoulumnB = 0 
   AND NOT EXISTS (SELECT NULL 
                     FROM TABLE b 
                    WHERE b.ColumnA = a.ColumnA 
                      AND b.ColumnB = 2)

答案 1 :(得分:1)

拥有not in可能对性能不利。您可以尝试分组,并计算每组中的零和二进制数:

select
  ColumnA,
  sum(case ColumnB when 0 then 1 else 0 end) as Zeroes,
  sum(case ColumnB when 2 then 1 else 0 end) as Twos
from TABLE
group by ColumnA
having Zeroes > 0 and Twos = 0

我不确定在没有检查执行计划的情况下这是否更有效,但因为它更直接,它可能很好。

此外,这是SQL Server语法,因此可能需要在Oracle中运行一些调整。

答案 2 :(得分:0)

我会说这和它一样好。真正获得更快的唯一方法是创建此查询的索引视图并将其用作数据源。

答案 3 :(得分:0)

我尽量避免使用NOT IN

也许这个?

SELECT DISTINCT ColumnA FROM TABLE t
LEFT JOIN TABLE z ON t.ColumnA=z.ColumnA AND z.ColumnB=2 
WHERE t.ColumnB=0 AND z.ColumnA IS NULL

答案 4 :(得分:0)

这是一个真实世界的例子吗?表只有这么少的行吗?如果是这样,那么你真的不太可能进一步优化它,表太小了。话虽如此,“不在”不会很好地扩展,你最好使用“不存在”。