我有一个相当可怕的查询,它使用需要在我们的数据库上运行的 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”记录,这些 SystemUserID 不具有 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”检查会更有效吗?或者你能想出更好的方法来处理和过滤这两个列表吗?