繁体   English   中英

带有 2 个矛盾子句的 SQL Where 条件 Oracle

[英]SQL Where condition with 2 contradicting clauses Oracle

我有一个包含元素列表的表格,这些元素具有由一个关系确定的“创建者类型”。 此关系字段值可以是 1-2-3。

我必须使用以下条件进行 sql 查询:

  • 获取所有值为 1 和(2 或 3)的元素
  • 忽略值为 1 而没有 2 或 3 的元素。

时间表

ID|NAMEUNIQUE|STARTTIME|ENDTIME|STATUS|CREATOR|CREATOR_TYPE
1 |AAAAAAAAAA|.........|.......|......|.......|1
2 |BBBBBBBBBB|.........|.......|......|.......|2
3 |BBBBBBBBBB|.........|.......|......|.......|1
4 |CCCCCCCCCC|.........|.......|......|.......|3
5 |DDDDDDDDDD|.........|.......|......|.......|1

在这种情况下,查询应该返回 ID 为 2、3、4、5 的行并丢弃 1,因为这是一个唯一的时间表 (AAAAAAAAA),它没有创建者类型 2 或 3。

对不起我的英语,很难向我解释这个

您可以在分析函数中使用条件聚合:

SELECT *
FROM   (
  SELECT s.*,
         COUNT(CASE creator_type WHEN 1 THEN 1 END)
           OVER (PARTITION BY nameunique) AS num_1s,
         COUNT(CASE creator_type WHEN 2 THEN 1 END)
           OVER (PARTITION BY nameunique) AS num_2s,
         COUNT(CASE creator_type WHEN 3 THEN 1 END)
           OVER (PARTITION BY nameunique) AS num_3s
  FROM   schedules s
)
WHERE num_1s > 0
AND   (num_2s > 0 OR num_3s > 0);

其中,对于样本数据:

CREATE TABLE schedules (id, nameunique, creator_type) AS
SELECT 1, 'AAAAA', 1 FROM DUAL UNION ALL
SELECT 2, 'BBBBB', 2 FROM DUAL UNION ALL
SELECT 3, 'BBBBB', 1 FROM DUAL UNION ALL
SELECT 4, 'CCCCC', 1 FROM DUAL UNION ALL
SELECT 5, 'CCCCC', 3 FROM DUAL UNION ALL
SELECT 6, 'DDDDD', 1 FROM DUAL;

输出:

ID NAMEUNIQUE CREATOR_TYPE NUM_1S NUM_2S NUM_3S
2 BBBB 2 1 1 0
3 BBBB 1 1 1 0
4 中国交建 1 1 0 1
5 中国交建 3 1 0 1

db<> 在这里摆弄

select *
from   (
         select s.*, 
                min(creator_type) over (partition by nameunique) as min_type,
                max(creator_type) over (partition by nameunique) as max_type
         from   schedules s
       )
where  min_type = 1 and max_type > 1
;

暂无
暂无

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

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