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

Sql 选择记录等于y但不等于x的用户,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表格,里面有参赛者投票的历史记录。该结构的简化示例如下: id | entrantId | roundId | judgeId 一些示例数据: 401 | 32 | 3 | 4 402 | 32 | 3 | 5 403 | 35 | 3 | 4 404 | 32 | 4 | 4 405 | 36 | 3 | 4 406 | 36 | 3 | 10 我需要获取用户的所有记录,这些用户具有judgeId=4和roundId=3,但同一个“entrantId”没有任何类型的记录,其中rou

我有一个表格,里面有参赛者投票的历史记录。该结构的简化示例如下:

id | entrantId | roundId | judgeId
一些示例数据:

401 | 32 | 3 | 4
402 | 32 | 3 | 5
403 | 35 | 3 | 4
404 | 32 | 4 | 4
405 | 36 | 3 | 4
406 | 36 | 3 | 10
我需要获取用户的所有记录,这些用户具有
judgeId=4
roundId=3
,但同一个“entrantId”没有任何类型的记录,其中
roundId=4

因此,使用上述数据,我希望检索记录
403
405
,因为这些参赛者(35和36)在第三轮中有评委4的记录,但在第四轮中没有记录(例如roundId=4)

我假设我需要一个SELECT语句,该语句使用一个基于“IN”的子句,但我对这方面的了解还不够,无法构建合适的查询


任何帮助都将不胜感激

您可以使用相关子查询:

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);

输出:

╔═════╦═══════════╦═════════╦═════════╗
║ id  ║ entrantId ║ roundId ║ judgeId ║
╠═════╬═══════════╬═════════╬═════════╣
║ 403 ║        35 ║       3 ║       4 ║
║ 405 ║        36 ║       3 ║       4 ║
╚═════╩═══════════╩═════════╩═════════╝

或者使用窗口功能:

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;

您可以使用,但无法获取ID

select entrantId 
  from table 
 where roundId = 3 and judgeId = 4 
except 
select entrantId 
  from table 
 where roundId = 4;

最简单、最具可读性和最直接的用法不在子查询中,如下所示

SELECT * FROM Votes WHERE judgeId = 4 AND roundId = 3
AND entrantId NOT IN (SELECT entrantId FROM Votes WHERE roundId = 4)

请不要提倡使用“不在”。它通常会根据TSQL的三值逻辑和不知道的开发人员向系统添加bug。除非列表是硬编码的,否则请始终使用“exists”而不是“in”。@shriop好提示。这是否意味着我们需要使用“不存在”?@shriop你知道“设置ANSI_空值”修复空值问题吗?@athermostafa,是的,我知道“设置ANSI_空值”的作用。我不同意你对“修复”的定义。更多的是那些不明显的地雷,我要求人们不要再到处乱扔,让年轻人用它们来炸脚趾。为什么您不只是想使用正确的语句语法?在TSQL中使用“not in”没有任何好处,而且有太多的陷阱。一种方法比另一种方法有什么显著的优势(例如速度、最佳实践)?@PhillHealey首先可以使用大多数RDBMS,其次不会,例如MySQL没有实现
行数
。对于您的情况,我将使用第一种解决方案