SQL Server:如何确定行是否存在值

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)

Lam*_*mak 5

这应该工作:

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)