Mysql 从给定列值在另一列中没有非空值的表中选择记录

Mysql 从给定列值在另一列中没有非空值的表中选择记录,mysql,Mysql,在这个简单的表格示例中: ID SUBID 1000 NULL 1000 NULL 1000 1 1000 NULL 1001 NULL 1001 NULL 我希望我的查询只返回1001的ID,因为所有1001个ID的子ID中都有NULL。应排除1000,因为至少有一个1000 ID的子ID中也有非NULL 例如,将我的简单英语转换为SQL: 从表中选择distinct id,其中所有具有该id的记录在subid中都为NULL您可以在其中为NULL的subid中使用NOT s

在这个简单的表格示例中:

ID    SUBID
1000  NULL
1000  NULL
1000  1
1000  NULL
1001  NULL
1001  NULL
我希望我的查询只返回1001的ID,因为所有1001个ID的子ID中都有NULL。应排除1000,因为至少有一个1000 ID的子ID中也有非NULL

例如,将我的简单英语转换为SQL:


从表中选择distinct id,其中所有具有该id的记录在subid中都为NULL

您可以在其中为NULL的subid中使用NOT

select distinct id 
from table 
where id NOT IN (
  select distinct id from table where subid is null  
) 

可以在子ID中使用NOT,其中NOT为null

select distinct id 
from table 
where id NOT IN (
  select distinct id from table where subid is null  
) 

使用GROUP BY查询,并使用聚合函数检查所有子ID项是否为空:

select ID
from myTable
group by ID
having bit_and(SUBID is null)
演示:

您还可以将HAVING子句替换为

having count(SUBID) = 0
因为COUNT将忽略所有空条目

演示:

此版本应适用于任何主要的RDBMS

这适用于大多数情况,因为如果所有条目都为NULL,它们将返回NULL。计数是个例外


但是,如果ID、SUBID上有索引,则-MAX或MIN可能最快。

使用GROUP BY查询,并使用聚合函数检查所有SUBID项是否为空:

select ID
from myTable
group by ID
having bit_and(SUBID is null)
演示:

您还可以将HAVING子句替换为

having count(SUBID) = 0
因为COUNT将忽略所有空条目

演示:

此版本应适用于任何主要的RDBMS

这适用于大多数情况,因为如果所有条目都为NULL,它们将返回NULL。计数是个例外

但是-MAX或MIN可能是最快的,如果您在ID、SUBID上有索引。

您可以使用NOT EXISTS子句检查具有非空SUBID值的ID值,并将其从结果中排除:

SELECT DISTINCT m1.ID
FROM myTable m1
WHERE NOT EXISTS (SELECT * 
                  FROM myTable m2 
                  WHERE m2.ID = m1.ID AND m2.subID IS NOT NULL)
或者,您可以计算与ID值关联的行数,也可以计算与该ID关联的空子ID值数,并查看它们是否相同:

SELECT ID
FROM myTable m1
GROUP BY ID
HAVING COUNT(*) = SUM(subid IS NULL)
输出:

1001
您可以使用NOT EXISTS子句检查具有非空subid值的ID值,并将其从结果中排除:

SELECT DISTINCT m1.ID
FROM myTable m1
WHERE NOT EXISTS (SELECT * 
                  FROM myTable m2 
                  WHERE m2.ID = m1.ID AND m2.subID IS NOT NULL)
或者,您可以计算与ID值关联的行数,也可以计算与该ID关联的空子ID值数,并查看它们是否相同:

SELECT ID
FROM myTable m1
GROUP BY ID
HAVING COUNT(*) = SUM(subid IS NULL)
输出:

1001

这很有效。我担心的是,随着数据库的增长,where子句中的select最终将开始返回大量记录,这会减慢速度。我担心的是,随着数据库的增长,where子句中的select最终将开始返回大量记录,并降低速度。这是可行的,我怀疑这是一个比scaisEdge建议的更具可扩展性的选项,尽管两者都可行。我没有任何经验,所以这对我来说是新的,但我认为它在这个例子中非常有用。谢谢这是可行的,我怀疑这是一个比scaisEdge建议的更具可扩展性的选项,尽管两者都可行。我没有任何经验,所以这对我来说是新的,但我认为它在这个例子中非常有用。谢谢