如何从多个等于0的SQL查询记录?

如何从多个等于0的SQL查询记录?,sql,duplicate-removal,Sql,Duplicate Removal,我有一个表,在第一列ID记录中有多个重复记录,但在第二列中有不同的数字数据 我希望能够识别哪些ID记录的所有数字记录都为0 例如,该表可以如下所示: ID Value 1 2 1 2 1 0 2 0 2 0 2 0 我只想标识ID 2,因为所有值都等于0。我不想要ID 1,因为存在大于0的值 很抱歉,如果格式不正确或容易混淆 SELECT * FROM table t1 WHERE NOT EXISTS (SELECT 1 FROM table t2 WHERE t

我有一个表,在第一列ID记录中有多个重复记录,但在第二列中有不同的数字数据

我希望能够识别哪些ID记录的所有数字记录都为0

例如,该表可以如下所示:

ID Value

1  2

1  2

1  0

2  0

2  0  

2  0
我只想标识ID 2,因为所有值都等于0。我不想要ID 1,因为存在大于0的值

很抱歉,如果格式不正确或容易混淆

SELECT *
FROM table t1
WHERE NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.ID = t1.id AND Value <> 0)
选择ID不在非零值记录集中的所有记录

SELECT DISTINCT ID FROM TABLE 
WHERE ID NOT IN (SELECT DISTINCT ID FROM TABLE WHERE VALUE <> 0)
这将获取表中没有非零值行的所有ID。

您可以在以下情况中使用not:

SELECT DISTINCT Id
FROM table1
WHERE Id NOT IN (SELECT Id FROM table1 WHERE Value <> 0)

对SQL来说有点陌生,我是从另一个select语句中选择的吗?还有,SELECT 1的意义是什么,我以前从未见过。@fordo19-这称为子查询。在SQL中非常常见。这种在NOT EXISTS中不使用join语句进行子查询联接的技术非常陈旧,不再被广泛使用。@Hogan我不同意。EXISTS和NOT EXISTS对于大型数据集的性能通常优于IN表达式,尽管大多数现代查询引擎都会将它们优化为相同的。但是,在任何子查询中,如果要针对多个字段进行联接,例如如果您有一个复合键,则必须使用EXISTS语法。此外,在IMX中,特别是在非IMX中,可能会被空值搞得一团糟,而只要选择一个静态值,EXISTS就不会存在。@BaconBits-我猜您使用DB2或Oracle,因为它们是存在的。MSQL支持IN而不是IN。但是你说的很好。。。这当然是真的,这将表现得更好DB2@fordo19SELECT 1只是要测试的DB的非空值。因为我们在结果中没有使用子查询,所以我们只需要满足查询语法的要求,即不能选择任何内容。您通常会将其视为SELECT*,它也可以工作,但由于我们不希望查询引擎费心查找表字段的名称,因此可以使用1来代替。然而,大多数现代数据库都会对它们一视同仁。看起来很像我的答案。我想我们是在同一时间写的。没有看到你的,我们不必怀疑。他们有时间戳。我的比你的早5分钟多。@Hogan,对不起。在我发布我的答案之前,我真的没有看到你的答案。没关系,它是在周五的eod,我是snarkySo,我要做的是首先说我希望我的表中有唯一的行,然后添加一个条件,即ID与非0的不同记录不匹配?也许内部查询中的不同记录有点不同overhead@fordo19-基本上是的。除非它不会按这个顺序发生-首先会找到不是0的列表。我实际上要问的是,有必要在子查询中使用distinct吗?这是一种让它更快的方法吗?@JoachimSauer-nope。这将加快查询速度,优化器可以在将第一个ID过滤到子查询结果中后忽略重复的ID。