SQL:如果在同一个表中没有其他具有特殊不同值的条目,则仅显示条目

时间:2014-02-13 17:55:20

标签: mysql sql select count distinct

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?我现在不知道怎么回事..提前谢谢!

5 个答案:

答案 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;

希望它有所帮助。