wma*_*uez 0 sql t-sql sql-server sql-server-2008
我有一个数据集,其中1列可能有2个不同的值为每个ID.我想知道是否有办法找出哪些ID没有其中一个值.
这是我的数据集样本的样子.
Object ID | Relate Type
------------------------
1 | P
1 | S
2 | P
3 | S
4 | P
4 | S
Run Code Online (Sandbox Code Playgroud)
我想写一个查询,告诉我哪个Objet ID没有S的相关类型.
这是我的第一次尝试:
SELECT [obj_id], COUNT([obj_id]) AS [Successor Count]
FROM [Prim].[dbo].[relations]
WHERE [relate_type] = 'S'
GROUP BY [obj_id]
Run Code Online (Sandbox Code Playgroud)
在考虑了一点之后,我意识到这永远不会给我一个0的后继数,因为我特意查询具有相关类型为S的对象ID.知道这一点,我决定我可能需要某种子查询,然后我想出了这两个解决方案:
SELECT [obj_id]
FROM [Prim].[dbo].[relations]
WHERE NOT EXISTS
(SELECT DISTINCT [obj_id], [relate_type]
FROM [Prim].[dbo].[relations]
WHERE relate_type = 'S')
Run Code Online (Sandbox Code Playgroud)
上述解决方案没有给我正确的答案.至少我很确定它没有.无论哪种方式,在相对较小的700,000个条目的数据集上运行需要2.5分钟.
以下查询我非常肯定有效并且运行得很快.但我想知道是否有不同的方法来做到这一点.
SELECT A.[obj_id]
FROM [Prim].[dbo].[relations] A
LEFT JOIN
(SELECT DISTINCT [obj_id], [relate_type]
FROM [Prim].[dbo].[relations]
WHERE [relate_type] = 'S') B ON A.[obj_id] = B.[obj_id]
WHERE A.[relate_type] != 'S' AND B.[obj_id] IS NULL
Run Code Online (Sandbox Code Playgroud)
这应该工作:
SELECT *
FROM [Prim].[dbo].[relations] r
WHERE NOT EXISTS(SELECT 1 FROM [Prim].[dbo].[relations]
WHERE [relate_type] = 'S'
AND obj_id = r.obj_id)
Run Code Online (Sandbox Code Playgroud)