我的 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] 删除。
我来说两句