![](/img/trans.png)
[英]How to determine next row value using select and case in 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])
您可以使用兩個查詢中的任何一個來獲取僅缺少S
或P
的列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.