繁体   English   中英

如果值存在于另一个表 sql 的任何行中,则过滤掉结果

[英]Filter out results if a value exists in any of the rows in another table sql

我试图计算有多少对象出现在表 2 中,但状态为 3 或 5。因此,如果它的状态为 3 或 5,我想将其排除在计数之外。 我被卡住的地方是有重复的值,因为它们可能有多个状态。 下面进一步解释。


Table 1

Object_ID 
1
2
3
4
5

Table 2

ID  |  object_id  |  status
1          2           2
2          2           3
3          2           5
4          3           2
5          3           2
6          3           7

最终目标

计算有多少 object_ids 的状态不包括 3 或 5。但也要忽略重复项。 在此示例中,总计数为 1(object_id 为 3)。 因为我需要找到表 2 中的所有行,所以基本上将它们合并在一起,假设它们的状态都不是 3 或 5。

Count.   |    object_id
  1      |        3

SELECT Count(distinct(object_id))
FORM table_2
WHERE status <> 3 or status <> 5

如果状态是 3 或 5,我似乎可以将它们分组,但我似乎无法排除它们。

希望这是有道理的,我试图简化它,所以我没有包含不相关的代码。

一种没有子查询的方法是:

select count(distinct object_id) - count(distinct case when status in (3, 5) then object_id end)
from table_2;

这将计算不同 object id 的数量,然后减去具有指定状态的不同 object id 的数量。

更典型的是,我会通过两个级别的聚合来解决这个问题:

select count(*)
from (select object_id
      from table_2
      group by object_id
      having sum( status in (3, 5) ) = 0
     ) o

您可以使用聚合:

select count(*) 
from (
    select object_id
    from table2
    group by object_id
    having max(status in (3, 5)) = 0
) t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM