gpt4 book ai didi

sql - 在 SQL 中执行多个 "IN"查询的最快方法

转载 作者:行者123 更新时间:2023-12-02 07:05:53 25 4
gpt4 key购买 nike

我有一个相当可怕的查询,使用 2 个“IN”语句需要在我们的数据库上运行。首先是架构(针对此示例进行了简化):

CREATE TABLE [dbo].[SystemUser]
(
[SystemUserID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](50) NULL,
[Surname] [nvarchar](50) NULL
CONSTRAINT [PK_ApplicationUser] PRIMARY KEY CLUSTERED
(
[SystemUserID] ASC
)
)
GO

CREATE TABLE [dbo].[Group]
(
[GroupID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL
CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[GroupID] ASC
)
)
GO

CREATE TABLE [dbo].[GroupMembership]
(
[SystemUserID] [int] NOT NULL,
[GroupID] [int] NOT NULL
CONSTRAINT [PK_GroupMembership] PRIMARY KEY CLUSTERED
(
[SystemUserID] ASC,
[GroupID] ASC
)
)
GO

我想做的是找到所有匹配 SystemUserID 列表的“SystemUser”记录,这些记录不属于 GroupID 列表中的“组”。

所以在一个查询中比较了 2 个单独的 ID 列表。我目前能想到的最快方法如下:

SELECT SU.SystemUserID
FROM [dbo].[SystemUser] SU
LEFT JOIN
(
SELECT GM.SystemUserID
FROM [dbo].[GroupMembership] GM
WHERE GM.GroupID IN
(
1, 7, 8, 10, 32
)
) GM ON GM.SystemUserID = SU.SystemUserID
WHERE SU.SystemUserID IN
(
10, 61, 80, 93, 98
)
AND GM.SystemUserID IS NULL /* Not matched */

有什么我想念的吗? “WHERE NOT EXISTS”检查会更有效率吗?或者你能想到一个更好的方法来处理和过滤这两个列表吗?

最佳答案

假设 SQL Server 2005 或更高版本,

SELECT SU.SystemUserID
FROM [dbo].[SystemUser] SU
WHERE SU.SystemUserID IN
(
10, 61, 80, 93, 98
)
EXCEPT
SELECT GM.SystemUserID
FROM [dbo].[GroupMembership] GM
WHERE GM.GroupID IN
(
1, 7, 8, 10, 32
)

关于sql - 在 SQL 中执行多个 "IN"查询的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070420/

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