在 SQL 中获取列 A 中具有相同值的所有行,这些行在列 B 中只有非空值

亨德里克·威斯

我的 SQL 表有多个列,其中 A 和 B。在 A 中有某种任意对象(例如,用户或项目)的某种标识符。由 A 标识的每个对象实例在数据库中可以有多个条目(A 不是唯一的)。此外,每个对象还有一个属性 B,该属性也存储在数据库中相应列 B 中。该属性可以为 NULL。

我现在想找到所有在数据库中只包含 B 非空值的行的对象。所以如果有一个对象 A=12345 至少有一行 B=NULL,它应该被排除在外。我还想对结果进行分组/压缩/组合,以便我只能获得具有给定条件的 A 列表。

对于简单的和未优化正在酝酿Python的解决方案,我可以继续下去,并解决它像这样:

from typing import Optional, Any
from dataclasses import dataclass

@dataclass
class Obj:
    A: int = 0
    B: Optional[Any] = None

Obj(0, "Test")
Obj(A=0, B='Test')
objects = [
    Obj(0, "Test1"),
    Obj(0, "Test2"),
    Obj(0, "Test3"),
    Obj(0, "Test4"),
    Obj(1, "Test1"),
    Obj(1, "Test2"),
    Obj(1, "Test3"),
    Obj(1, None),
    Obj(2, "Test1"),
    Obj(2, "Test2"),
    Obj(2, "Test3"),
    Obj(2, "Test4"),
]
object_As = set([o.A for o in objects])
result = []
for obj_A in object_As:
    objects_Bs_by_A = [bool(o.B is not None) for o in objects if o.A == obj_A]
    if all(objects_Bs_by_A):
        result.append(obj_A)
result
[0, 2]

所以,问题是:为此目的,正确的 SQL 查询会是什么样子?

戈登·利诺夫

您可以使用聚合:

select a
from t
group by a
having count(*) = count(b);

count(b)计算 中非 NULL 值的数量b这只是说这等于 each 的所有行a

如果你想要原始行,你可以使用not exists

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.a = t.a and t2.b is null
                 );

为了提高性能,您需要在t(a, b).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL将B列中与A列中的所有值具有相同值的B列中的所有值连接在一起

SQL 选择链接表中所有行在 x 列中具有相同值的行

SQL查询:获取不存在具有相同值和列值B的列A的行

如何从A列中选择所有不同的值,这些值在mySQL中的B列中具有确定的值

有没有办法从 SQL 中的一组列中获取所有非空值?

如果另一列在SQL Server中相同,则获取具有最小列值的行

如果条件适用于选项卡delim文件的所有行,这些行在特定列中具有相同的值:

SQL Server - 僅當同一列和表中該用戶 ID 存在值 B 時,才排除具有值 A 的所有行

从R中的df中删除具有相同列A值但具有不同列B值的行(反之亦然)

MySQL在列A中找到所有具有相同值但在克隆B中具有不同值的元素

获取所有在SQL Server中不只有NULL值的列的列表

使用SQL选择列1中具有相同值但列2和3中具有不同值的所有行

如何获取在SQL中给定行具有空值的列数?

在具有 2 列 a 和 b 的二维数组中。对于 a 列中的所有相同值,从 php 中的 b 列中选取相应的值?

删除所有列中具有相同值的行

删除所有列中具有相同值的行

需要找出SQL Server表中的所有列是否具有相同的值

SQL:根据表B中的列值查找表A中没有表B中值的所有记录

SQL-获取行,其中列A的所有值X =值B

如果表A中的列具有特定值,则SQL触发器将插入表B中的行

Spark获取列中数组中具有相同值的所有行

Excel 列 B 有重复项,对于 B 中的每组重复项,在 A 列中只有 1 行具有值,返回某些内容以识别匹配项

Oracle - 从具有特定列和值的所有表中获取数据的 SQL

从表中选择所有行,除了具有相同 id 的另一个表中的行在另一列中具有特定值

标识组在多列 SQL 中具有相同的值

如何从 SQL 表中获取行而忽略在特定列中具有重复值的行

SQL Server:获取其他所有列都具有相同值的列值

从SQL Server表中检索在列中具有相同值的行

对 SQL 中多列中具有相同值的行返回 True