0

特定のSubId/WorkflowIdの組み合わせにレコードが存在するかどうかを確認したいのですがProcessCode = 10、同じSubId/WorkflowId組み合わせにProcessCode20、30、および40の行があります。以下は、私がやろうとしていることの記述が不十分なバージョンです。よりエレガントなソリューションを望んでいます。このクエリは基本的に、ルールに違反しているものをすべて識別します。

IF EXISTS( SELECT * FROM @DataTable WHERE SubID = @SubId and WorkflowId = @WorkflowId and ProcessCode = 10)
AND (
NOT EXISTS( SELECT * FROM @DataTable WHERE SubID = @SubId and WorkflowId = @WorkflowId  and ProcessCode = 20) or 
NOT EXISTS( SELECT * FROM @DataTable WHERE SubId = @SubId and WorkflowId = @WorkflowId and ProcessCode = 30) or
NOT EXISTS( SELECT * FROM @DataTable WHERE SubID = @SubId and WorkflowId = @WorkflowId and ProcessCode = 40)
)
4

3 に答える 3

2

ProcessCode 10を持っているが20/30/40を持っていないすべてのSubIDとWorkFlowIDを検索したい場合は、各Sub/Workflowを個別にチェックするのではなくこのクエリを使用できます。

SELECT 
    SubID,
    WorkFlowID
FROM @DataTable 
GROUP BY SubID, WorkFlowID
HAVING SUM(CASE WHEN ProcessCode = '10' THEN 1 ELSE 0 END) > 0
AND COUNT(DISTINCT (CASE WHEN ProcessCode IN ('20','30','40') THEN ProcessCode ELSE NULL END)) < 3

SQLフィドル

于 2012-09-19T13:20:02.267 に答える
0

このようなもの?

IF EXISTS(
    SELECT 1 FROM @DataTable DT
    LEFT JOIN @DataTable DT2 ON DT.SubId = DT2.SubId AND DT.WorkflowId = DT2.WorkflodId AND DT2.ProcessCode IN (20, 30, 40)
    WHERE DT.ProcessCode = 10 AND DT2.ProcessCode IS NULL
)
于 2012-09-18T20:45:03.543 に答える
0
IF EXISTS( SELECT * FROM @DataTable WHERE SubID = @SubId and WorkflowId = @WorkflowId and ProcessCode = 10)
AND (NOT EXISTS ( SELECT * FROM @DataTable WHERE SubID = @SubId and WorkflowId = @WorkflowId  and ProcessCode in (20, 30, 40)))
于 2012-09-19T13:25:05.350 に答える