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建议的更具可扩展性的选项,尽管两者都可行。我没有任何经验,所以这对我来说是新的,但我认为它在这个例子中非常有用。谢谢