如何在自连接中使用EXISTS查询Orgorder从未等于1的Id
问题需求
查询MSSQL中TEST表内,所有ORGORDER字段值从未等于1的Id。
测试表结构与数据
CREATE TABLE [dbo].[TEST]( [ORGORDER] [int] NULL, [Id] [int] NOT NULL, [ORGTYPE] [varchar](30) NULL, ORGID INT NULL, [LEAD] [decimal](19, 2) NULL ) ON [PRIMARY] GO INSERT [dbo].[TEST] ([ORGORDER], [Id], [ORGTYPE] ,ORGID, [LEAD]) VALUES (1, 100, N'ABC',1, NULL) GO INSERT [dbo].[TEST] ([ORGORDER], [Id], [ORGTYPE],ORGID, [LEAD]) VALUES (0, 100, N'ABC',2, 0) GO INSERT [dbo].[TEST] ([ORGORDER], [Id], [ORGTYPE],ORGID, [LEAD]) VALUES (0, 100, N'ACD',1, NULL) GO INSERT [dbo].[TEST] ([ORGORDER], [Id], [ORGTYPE],ORGID, [LEAD]) VALUES (0, 101, N'ABC',0, 0) GO INSERT [dbo].[TEST] ([ORGORDER], [Id], [ORGTYPE],ORGID, [LEAD]) VALUES (2, 101, N'ABC',4, NULL) GO
预期返回结果
ID 101
正确查询语句
方案1:使用NOT EXISTS实现(符合自连接逻辑思路)
SELECT DISTINCT Id FROM TEST t1 WHERE NOT EXISTS ( SELECT 1 FROM TEST t2 WHERE t2.Id = t1.Id AND t2.ORGORDER = 1 )
逻辑说明:遍历每一条记录,检查是否存在同Id下ORGORDER等于1的记录,若不存在则保留该Id,用DISTINCT去重避免同一个Id多次返回。
方案2:使用GROUP BY + HAVING实现(更简洁高效)
SELECT Id FROM TEST GROUP BY Id HAVING MAX(CASE WHEN ORGORDER = 1 THEN 1 ELSE 0 END) = 0
逻辑说明:按Id分组后,每组只要存在一条ORGORDER=1的记录,聚合后的最大值就为1,筛选最大值为0的分组,即为所有ORGORDER从未等于1的Id。
内容的提问来源于stack exchange,提问作者som_1522
相关产品推荐
相关产品推荐

