选择记录等于y但不是x的用户

Phi*_*ley 3 sql t-sql sql-server

我有一张表格,其中包含参赛者参赛选票的历史记录.结构的简化示例是:

id | entrantId | roundId | judgeId
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

401 | 32 | 3 | 4
402 | 32 | 3 | 5
403 | 35 | 3 | 4
404 | 32 | 4 | 4
405 | 36 | 3 | 4
406 | 36 | 3 | 10
Run Code Online (Sandbox Code Playgroud)

我需要得到谁拥有用户的所有记录的judgeId = 4roundId = 3,但在相同的"entrantId"没有任何地方的记录roundId = 4

因此,使用上面的数据,我将寻找检索记录403,405因为这些参赛者(35和36)在第3轮中有法官4的记录,但在第4轮没有记录(例如roundId = 4)

我假设我需要一个使用基于'IN'的子句的SELECT语句,但我对此知之甚少,无法构建合适的查询.

任何帮助将不胜感激.

Luk*_*zda 9

您可以使用相关子查询:

SELECT *
FROM tab t1
WHERE judgeId = 4 
  AND roundId = 3
  AND NOT EXISTS (SELECT 1
                  FROM tab t2
                  WHERE t1.entrantId = t2.entrantId
                    AND t2.roundId = 4);
Run Code Online (Sandbox Code Playgroud)

LiveDemo

输出:

???????????????????????????????????????
? id  ? entrantId ? roundId ? judgeId ?
???????????????????????????????????????
? 403 ?        35 ?       3 ?       4 ?
? 405 ?        36 ?       3 ?       4 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)


或者使用窗口函数:

WITH cte AS(
SELECT *,
  c = COUNT(CASE WHEN roundId = 4 THEN 1 END) OVER (PARTITION BY entrantId)
FROM #tab
)
SELECT id,entrantId,roundId,judgeId
FROM cte
WHERE c = 0
  AND judgeId = 4 
  AND roundId = 3;
Run Code Online (Sandbox Code Playgroud)

LiveDemo2