sql - 从一张表中获取交叉数据的最佳方法是什么?

标签 sql sql-server database performance

假设我有下表

enter image description here

CREATE TABLE [dbo].[TestData](
    [ID] [bigint] NOT NULL,
    [InstanceID] [int] NOT NULL,
    [Field] [int] NULL,
    [UserID] [bigint] NOT NULL
) ON [PRIMARY]

GO
INSERT [dbo].[TestData] ([ID], [InstanceID], [Field], [UserID]) 
VALUES (1, 1, NULL, 1000),(2, 1, NULL, 1002),(3, 1, NULL, 1000),
    (4, 1, NULL, 1003),(5, 2, NULL, 1002), (6, 2, NULL, 1005),
    (7, 2, NULL, 1006),(8, 2, NULL, 1007),(9, 3, NULL, 1002),
    (10, 3, NULL, 1006),(11, 3, NULL, 1009),(12, 3, NULL, 1010),
    (13, 1, NULL, 1006),(14, 2, NULL, 1002),(15, 3, NULL, 1003)
GO

我寻找最佳实践来编写查询以使用 UserID 获取两个实例之间相交数据的完整行

例如,InstanceID 1 和 2 之间相交的 UserIDs 是( 1002 , 1006 ),为了获得结果,我以两种不同的方式进行查询,如下所示:

Select * From TestData
Where UserID in 
( 
    Select T1.UserID From TestData T1 Where InstanceID = 1
        Intersect
    Select T2.UserID From TestData T2 Where InstanceID = 2
)
and InstanceID in (1,2) Order By 1

第二

Select * From TestData
Where UserID in 
( 
    Select Distinct T1.UserID 
    From TestData T1 join TestData T2 on T1.UserID = T2.UserID
    Where T1.InstanceID = 1 and T2.InstanceID = 2
)
and InstanceID in (1,2) Order By 1

所以结果会是

enter image description here

上述查询之一是获得结果的最佳方式吗??

最佳答案

使用 EXISTS 比使用 IN 更好。使用 IN 子查询时,将处理整个结果集。使用 EXISTS,它只会在发现匹配时进行搜索。至于你的问题,我认为 INTERSECT 实现只是简单地进行连接,所以应该没有区别。

编辑:帖子 Here表示对于 INEXISTS,优化器将同样对待它们(截至 2008 年)。所以几乎我的猜测以及我刚刚读到的内容归结为:它们将执行相同的操作,因为优化器知道。

关于sql - 从一张表中获取交叉数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158365/

相关文章:

sql - 将 F# 连接到 SQL 时出错

mysql - SQL LEFT JOIN where 子句与 IN 比较

sql-server - 如何在 SQL Server 2012 中删除列中的双引号

mysql - 根据上传问题查找教师月报

mysql - 如何在mysql中将一个表中的3列复制到另一个表中

sql - 使用两个参数的 VB.net 搜索查询

PHP 是否可以在 while 循环中为每个 POST 表单发送唯一的值?

sql - 如何将表列标题添加到sql select语句

sql-server - 如何在 Visual Studio 数据库项目中处理用户和登录?

php - 无法创建表