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

时间:2019-02-27 19:12:58

标签: mysql

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

ID    SUBID
1000  NULL
1000  NULL
1000  1
1000  NULL
1001  NULL
1001  NULL

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

类似(将普通英语转换为SQL):

从表中选择唯一的ID,其中具有该ID的所有记录的子ID均为NULL

3 个答案:

答案 0 :(得分:2)

您可以在没有null的子ID中使用

<TableCell className={classNames(classes.urlDealCell, classes.dealCell)}>
    {this.getLogo(deal.CompanyWebsite)}
</TableCell>

答案 1 :(得分:1)

使用GROUP BY查询,并使用BIT_AND()聚合函数检查所有SUBID条目是否为NULL:

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

演示:https://www.db-fiddle.com/f/8dnfHV6VVVu7dvoZarTjdp/0

您还可以将

替换为HAVING子句
having count(SUBID) = 0

因为COUNT()将忽略所有NULL条目。

演示:https://www.db-fiddle.com/f/t3FrL7zUAwGqqWDS4dQUg9/0

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

having max(SUBID) is null

这适用于大多数aggregate functions,因为如果所有条目均为NULL,则它们将返回NULL。 (COUNT()是一个例外。)

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

答案 2 :(得分:1)

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

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值关联的行,也可以计算与该NULL关联的subid ID值的数量,并查看它们是否为一样:

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

输出:

1001

Demo on dbfiddle