ID ID_A Status
175 473 2
174 473 1
173 455 2
170 412 2
169 397 1
168 393 2
173 391 2
这就是我的示例表。结果我希望它只显示状态= 1,按ID_A分组的条目。它必须不包含Status = 2的结果! 结果应如下所示:
ID_A Status
397 1
我的问题是可能有两个类似的ID_A条目。不知道这是否容易用COUNT或DISTINCT?我现在不知道怎么回事..提前谢谢!
答案 0 :(得分:1)
这有时称为排除连接。
您执行外部联接以尝试查找会使您的条件无效的行。如果没有这样的行,外连接会将NULL放入连接表的所有列中,然后匹配。
SELECT t1.ID_A, t1.Status
FROM exampletable AS t1
LEFT OUTER JOIN exampletable AS t2
ON t1.ID_A = t2.ID_A AND t2.Status = 2
WHERE t1.Status = 1
AND t2.ID IS NULL;
来自@Strawberry的评论:
2001年的美国专利"Optimizing an exclusion join operation using a bitmap index structure"定义了排除连接:
排除连接操作选择第一个表中具有指定列值的行,其中在第二个表的指定列中找不到值。数据库系统可以通过排除第一个表中与第二个表中的条目匹配的条目来执行这样的查询。
该专利还引用了1993年的一篇论文,"Parallel implementations of exclusion joins"
我认为该术语也早于该论文。
答案 1 :(得分:0)
您可以使用聚合和having
子句执行此操作:
select id_a, group_concat(status) as statuses
from table t
group by id_a
having sum(status = 2) = 0;
答案 2 :(得分:0)
尝试
select t.id_A,t.status
from exampletabla as t
where t.status = 1 and t.id_A not in (select id_A from exampletabla where status = 2)
答案 3 :(得分:0)
select distinct x.id_a, x.status
from tbl x
where status = 1
and not exists (select 'y'
from tbl y
where x.id_a = y.id_a
and status = 2)
答案 4 :(得分:0)
您可以首先查找列中的唯一条目,然后根据条件查找确切的值。
select ID_A ,Status
FROM testTbl
group by ID_A
having COUNT(*) = 1 and Status = 1;
希望它有所帮助。