SQL检查组是不是包含给定列的某些值(ORACLE)

Posted

技术标签:

【中文标题】SQL检查组是不是包含给定列的某些值(ORACLE)【英文标题】:SQL check if group containes certain values of given column (ORACLE)SQL检查组是否包含给定列的某些值(ORACLE) 【发布时间】:2017-06-20 13:02:02 【问题描述】:

我有包含这些记录的表 audit_log:

log_id | request_id | status_id
 1     |  2         |  5
 2     |  2         |  10
 3     |  2         |  20
 4     |  3         |  10
 5     |  3         |  20

我想知道是否存在同时具有 status_id 5 和 10 的 request_ids。因此,此查询应返回 request_id = 2,因为它的列 status_id 具有值 5 和 10(省略了 request_id 3,因为 status_id 列只有值 10 而没有 5)。 我怎么能用 SQL 做到这一点? 我想我应该按 request_id 使用 group,但我不知道如何检查 group 是否具有值为 5 和 10 的 status_id?

谢谢, 错别字

【问题讨论】:

你可以使用GROUP_CONCAT。 我正在使用 Oralce 数据库... request_id/status_id 的组合是唯一的吗? 【参考方案1】:

这可能是一种方式:

/* input data */ 
with yourTable(log_id , request_id , status_id) as (
 select 1   , 2     ,  5 from dual union all
 select 2   , 2     , 10 from dual union all
 select 3   , 2     , 20 from dual union all
 select 4   , 3     , 10 from dual union all
 select 5   , 3     , 20 from dual
 )
/* query */
select request_id
from yourTable
group by request_id
having count( distinct case when status_id in (5,10) then status_id end) = 2 

它是如何工作的:

select request_id, 
       case when status_id in (5,10) then status_id end as checkColumn
from yourTable

给予

REQUEST_ID CHECKCOLUMN
---------- -----------
         2           5
         2          10
         2
         3          10
         3

所以条件count (distinct ...) = 2 起作用了

【讨论】:

【参考方案2】:
SELECT   request_id
FROM     table_name
GROUP BY request_id
HAVING   COUNT( CASE status_id WHEN  5 THEN 1 END ) > 0
AND      COUNT( CASE status_id WHEN 10 THEN 1 END ) > 0

【讨论】:

【参考方案3】:

要检查两个值是否存在(不考虑其他值),您可以在聚合之前进行过滤:

select request_id
from yourTable
where status_id in (5,10)
group by request_id
having count(*) = 2 -- status_id is unique
 -- or 
having count(distinct status_id) = 2 -- status_id exists multiple times

【讨论】:

经过大量搜索,您救了我的命!谢谢!【参考方案4】:

应该这样做:

select
    log5.*, log10.status_id
from
    audit_log log5
    join audit_log log10 on log10.request_id = log5.request_id
where
    log5.status_id = 5
    and log10.status_id = 10
order by
    log5.request_id
;

这是输出:

+ ----------- + --------------- + -------------- + -------------- +
| log_id      | request_id      | status_id      | status_id      |
+ ----------- + --------------- + -------------- + -------------- +
| 1           | 2               | 5              | 10             |
+ ----------- + --------------- + -------------- + -------------- +
1 rows

这是设置示例的 sql:

create table audit_log (
    log_id int,
    request_id int,
    status_id int
 );

insert into audit_log values (1,2,5);
insert into audit_log values (2,2,10);
insert into audit_log values (3,2,20);
insert into audit_log values (4,3,10);
insert into audit_log values (5,3,20);

【讨论】:

以上是关于SQL检查组是不是包含给定列的某些值(ORACLE)的主要内容,如果未能解决你的问题,请参考以下文章

打印表中给定列的重复值,次数与它们出现的次数一样多。 SQL

关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素

如何通过SQL查询检查列的数值是不是包含字母

如何检查我的表中列的任何值是不是包含 MS ACCESS 2003 中的尾随空格?

SQL - 为给定列中的值获取另一列的值