2017-06-08 42 views
-3

我正在尝试编写一个查询,其中排除了具有三个相同日期值ie的meter_nos。 1-3的关系。使用Oracle SQL的子查询

该查询只能显示具有不同日期的meter_nos,即1-1关系。

任何人都可以帮忙吗?

...and a.mtr_id in (select b.mtr_id 
       from ci_mtr_config b 
       where a.mtr_id=b.mtr_id 
       group by b.mtr_id 
       having count(b.mtr_id)=3) 
    and a.mtr_id not in (select f.eff_dttm 
       from ci_mtr_config f 
        where a.mtr_id=f.mtr_id 
        group by f.eff_dttm 
        having count(f.eff_dttm)=3) 

这不起作用:我是一个样本下方卡住

继承人。

+1

编辑你的问题,并提供样本数据,预期的效果,并且你已经尝试的代码更加准确。 –

+0

如果您阅读以下内容,您将得到更快的答案:https://stackoverflow.com/help/mcve *(并按照上面的建议)* –

回答

1

尝试使用COUNT(*)OVER(PARTITION BY ....)来计算共享相同仪表和日期的行数。然后过滤该计算。

CREATE TABLE CI_MTR_CONFIG 
    (MTR_ID INT, EFF_DTTM DATE) 
; 

INSERT INTO CI_MTR_CONFIG 
    (MTR_ID, EFF_DTTM) 
    VALUES 
    (303, to_date('2017-01-01','yyyy-mm-dd')), 
    (303, to_date('2017-01-01','yyyy-mm-dd')), 
    (303, to_date('2017-01-01','yyyy-mm-dd')), 
    (202, to_date('2017-01-01','yyyy-mm-dd')), 
    (202, to_date('2017-01-01','yyyy-mm-dd')), 
    (101, to_date('2017-01-01','yyyy-mm-dd')) 
; 

select 
    * 
from (
     select 
      *, count(*) over(partition by MTR_ID, EFF_DTTM) as count_of 
     from CI_MTR_CONFIG 
    ) d 
where count_of = 1 

从上面的样本数据只返回计量器101。

注意如果EFF_DTTM信息比日常使用TRUNC()

count(*) over(partition by MTR_ID, TRUNC(EFF_DTTM)) as count_of 
+0

如何在主查询中显示count_of = 1,它不工作 @ used_by_already –

+0

在srkect子句中包含** count_of **。如果查询不起作用,您还没有正确实施。再次检查。 –

+0

顺便说一句,“不工作”和“不满足我的需求”之间有区别。不工作给我说它会产生一个错误,因此你没有正确实施。示例查询的运行没有错误。 –