gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:31 26 4
gpt4 key购买 nike

假设我有下表

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com