簡體   English   中英

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

[英]SQL Server: How to determine if a value exists for a row

我有一個數據集,其中1列的每個ID可能有2個不同的值。 我想知道是否有辦法找出哪些ID沒有值之一。

這是我的數據集示例。

Object ID | Relate Type
------------------------
     1    |     P
     1    |     S
     2    |     P
     3    |     S
     4    |     P
     4    |     S

我想寫一個查詢,告訴我哪個Objet ID沒有S的關聯類型。

這是我的第一次嘗試:

SELECT [obj_id], COUNT([obj_id]) AS [Successor Count]
 FROM [Prim].[dbo].[relations]
 WHERE [relate_type] = 'S'
 GROUP BY [obj_id]

考慮了一下之后,我意識到這將永遠不會給我一個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')

上面的解決方案沒有給我正確的答案。 至少我很確定沒有。 無論哪種方式,在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

這應該工作:

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)

我想出了另一個選擇。 告訴我您的情況是否更快。 :)

SELECT [obj_id]
FROM [Prim].[dbo].[relations]
GROUP BY [obj_id]
HAVING MAX(CASE WHEN [relate_type] = 'S' THEN 1 ELSE 0 END) = 0

從您的問題看來,您想要一個缺少任何一個值的所有ID的列表。 這將為您提供缺少[obj_id][relate_type]列表(擴展上一個答案)

SELECT [obj_id], 
 CASE WHEN [relate_type] = 'P' THEN 'S'
END AS [relate type missing]
FROM [Prim].[dbo].[relations] r
WHERE NOT EXISTS(SELECT 1 FROM [Prim].[dbo].[relations]
                 WHERE [relate type] = 'S'
                 AND [obj_id] = r.[obj_id])
UNION              
SELECT [obj_id], 
     CASE WHEN [relate_type] = 'S' THEN 'P'
END AS [relate type missing]
FROM [Prim].[dbo].[relations] r
WHERE NOT EXISTS(SELECT 1 FROM [Prim].[dbo].[relations]
                 WHERE [relate type] = 'P'
                 AND [obj_id] = r.[obj_id])        

您可以使用兩個查詢中的任何一個來獲取僅缺少SP的列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM