【问题标题】:Need to fetch all the records of table "#Tbl1" which "DisplayId" not present in table "#Tbl2"需要获取表“#Tbl1”的所有记录,其中“DisplayId”不存在于表“#Tbl2”中
【发布时间】:2016-10-12 08:53:54
【问题描述】:

我需要获取表“#Tbl1”的所有记录,其中“DisplayId”不存在于表“#Tbl2”中。

  1. “#Tbl1”最多有 100 条记录
  2. “#Tbl2”正在增长表

    创建表#Tbl1(Id1 Int Identity(1,1), DisplayId Nvarchar(200), Name Nvarchar(200)) 插入 #Tbl1(DisplayId, Name) 值 ('d1', 'ABC'),('d2', 'PQR')

    创建表 #Tbl2(Id2 Int Identity(1,1), DisplayId Nvarchar(200)) 插入 #Tbl2(DisplayId) 值('d1')

以下查询有效,但正在寻找有效的查询,请建议哪个表的列需要什么样的索引?

我使用的是 SQL Server 2008 R2

Select * From #Tbl1
Where DisplayId Not In (Select DisplayId From #Tbl2)

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    使用 in 语句通常似乎很慢,如果可能,我会使用 exists 语句,但我不确定 SQL Server 2008 是否支持它。您拥有的其他选项是左连接,它也会很慢.

    存在或(不存在)语句的工作方式如下

    select * from #tbl1 t1 
    where not exists (select displayid from #tbl2 where displayid = t1.displayid)
    

    注意别名t1的使用,不必在sub select中选择列,可以使用通配符*。我发现这种类型的查询效率更高,因为它直接使用两个表之间的索引链接,而不是先选择所有列然后过滤它们。

    【讨论】:

    • 我们需要任何非集群索引
    • 我会创建并测试两者,如果您查看查询的执行计划,您应该能够看到优化器会选择哪一个,一些反馈会很棒,我从来没有玩过使用索引类型来查看它是否提供了进一步的速度改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多