使用Not In和子查询

时间:2013-09-19 18:44:16

标签: sql sql-server-2005

我有以下查询:

select *
from    Table1 tb1
where   ((tb1.Field1 + tb1.Field2 + tb1.Field3) not in
        (
            select  (tb2.Field1 + tb2.Field2 + tb2.Field3)
            from    Table2 tb2          )
    )

查询在sql server 2000上运行大约10秒钟,但在sql server 2005上运行了几个小时。这些机器是相同的,两个环境都具有相同的密钥和索引。 每个表有大约350,000条记录。我唯一能想到的是sql2005不能处理相同的连接。 我正在升级到sql2005(哈哈,我希望它会是2008年或2012年,但这是我无法控制的)。任何想法将不胜感激。

谢谢, 弗兰克

3 个答案:

答案 0 :(得分:1)

SELECT  *
FROM    Table1 tb1
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    table2 tb2
        WHERE   tb2.field1 = tb1.field1
                AND tb2.field2 = tb1.field2
                AND tb3.field3 = tb1.field3
        )

这适用于两个数据库。

答案 1 :(得分:0)

我建议你在两个数据库中编写这样的查询:

select tb1.*
from Table1 tb1 left outer join
     Table2 tb2
     on tb1.Field1 = tb2.Field1 and
        tb1.Field2 = tb2.Field2 and
        tb1.Field3 = tb3.Field3
where tb2.Field1 is null;

然后,如果效果不佳,您甚至可以在Table2(Field1, Field2, Field3)和/或Table1(Field1, Field2, Field3)上添加索引以提高效果。

(注意:我假设连接是为了确保各个字段是相同的。也就是说,在一个表中没有类似('A','B','C')的情况和('ABC','','')在另一个。)

答案 2 :(得分:0)

我建议使用NOT EXISTS而不是NOT IN