假设我有下表
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
所以结果会是
上述查询之一是获得结果的最佳方式吗??
最佳答案
使用 EXISTS
比使用 IN
更好。使用 IN
子查询时,将处理整个结果集。使用 EXISTS
,它只会在发现匹配时进行搜索。至于你的问题,我认为 INTERSECT
实现只是简单地进行连接,所以应该没有区别。
编辑:帖子 Here表示对于 IN
与 EXISTS
,优化器将同样对待它们(截至 2008 年)。所以几乎我的猜测以及我刚刚读到的内容归结为:它们将执行相同的操作,因为优化器知道。
关于sql - 从一张表中获取交叉数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158365/