使用 Oracle SQL 的子查询

Posted

技术标签:

【中文标题】使用 Oracle SQL 的子查询【英文标题】:Subquery using Oracle SQL 【发布时间】:2017-06-08 01:10:40 【问题描述】:

我正在尝试编写一个查询,其中不包括具有三个相同日期值的meter_nos,即。 1-3 关系。

查询只能显示具有不同日期的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)

这不起作用。

【问题讨论】:

编辑您的问题并提供示例数据、所需结果以及您尝试过的代码。 如果您阅读以下内容,您将获得更快的答案:***.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

【讨论】:

如何在主查询中显示 count_of =1,它不起作用@used_by_already 在 srkect 子句中包含 count_of。如果查询不起作用,则说明您没有正确实现它。再检查一遍。 顺便说一句,“不工作”和“不满足我的需求”是有区别的。对我不起作用说它会产生错误,因此您没有正确实施。示例查询运行没有错误。 mmm,如果您确实希望结果中出现 'count_of =1',请在顶部选择子句中使用 select 'count_of =1' as x,其中 x 是您的标题提供该列

以上是关于使用 Oracle SQL 的子查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle SQL 的子查询

FROM中的子查询不在Oracle SQL中工作

Oracle SQL 更新基于两个表之间的子查询

FROM 中的子查询在 Oracle SQL 中不起作用

Oracle SQL 中结合 LIMIT 子句访问主表字段的子查询

oracle sql语言模糊查询