【问题标题】:SQL group function nested too deeplySQL 组函数嵌套太深
【发布时间】:2013-05-10 16:35:32
【问题描述】:

我正在尝试创建一个 sql 查询,该查询将返回出现在两个表之间的 id 的最小出现次数,但是我不断收到 HAVING MIN(COUNT(E.C_SE_ID)) 行的错误。 Oracle 说按功能分组的嵌套太深。 我想不出另一种方式来返回C_SE_ID

SELECT CS.C_SE_ID, MIN(COUNT(E.C_SE_ID))
FROM COURSE_SECTION CS, ENROLLMENT E, LOCATION L
WHERE CS.C_SE_ID=E.C_SE_ID
AND CS.LOC_ID=L.LOC_ID
AND L.BLDG_CODE='DBW'
GROUP BY CS.C_SE_ID
HAVING MIN(COUNT(E.C_SE_ID));

在注册表中s_idc_se_id 已链接,我正在尝试获取与c_se_id 相关的所有s_id。使用更新的查询,oracle 不喜欢select *(原因很明显),但是当我也更改它时e.c_Se_id 我什么也得不到。

SELECT E.S_ID
FROM COURSE_SECTION CS, ENROLLMENT E
WHERE CS.C_SE_ID=E.C_SE_ID
AND E.C_SE_ID =(
select *
from (select CS.C_SE_ID, count(*) as cnt,
      max(count(*)) over (partition by cs.c_se_id) as maxcnt
      from COURSE_SECTION CS join
           ENROLLMENT E
           on CS.C_SE_ID=E.C_SE_ID join
           LOCATION L
           on CS.LOC_ID=L.LOC_ID
      where L.BLDG_CODE='DBW'
      GROUP BY CS.C_SE_ID
      order by count(*) desc
     ) t
where cnt = maxcnt);

【问题讨论】:

    标签: sql oracle group-by having


    【解决方案1】:

    一种方法是嵌套查询,然后选择输出中的第一行:

    select C_SE_ID, cnt
    from (select CS.C_SE_ID, count(*) as cnt
          from COURSE_SECTION CS join
               ENROLLMENT E
               on CS.C_SE_ID=E.C_SE_ID join
               LOCATION L
               on CS.LOC_ID=L.LOC_ID
          where L.BLDG_CODE='DBW'
          GROUP BY CS.C_SE_ID
          order by count(*) desc
         ) t
    where rownum = 1
    

    请注意,我使用 on 而不是 where 将连接语法更新为更现代的版本。

    如果您想要所有 个最小值(并且不止一个),那么我会使用分析函数。这与您的原始查询非常相似:

    select *
    from (select CS.C_SE_ID, count(*) as cnt,
                 max(count(*)) over (partition by cs.c_se_id) as maxcnt
          from COURSE_SECTION CS join
               ENROLLMENT E
               on CS.C_SE_ID=E.C_SE_ID join
               LOCATION L
               on CS.LOC_ID=L.LOC_ID
          where L.BLDG_CODE='DBW'
          GROUP BY CS.C_SE_ID
          order by count(*) desc
         ) t
    where cnt = maxcnt;
    

    试试这个而不是你原来的查询:

    SELECT E.S_ID
    FROM ENROLLMENT E
    where E.C_SE_ID in (select C_SE_ID
                        from (select CS.C_SE_ID, count(*) as cnt,
                                     max(count(*)) over (partition by cs.c_se_id) as maxcnt
                              from ENROLLMENT E
                                   LOCATION L
                                   on CS.LOC_ID=L.LOC_ID
                              where L.BLDG_CODE='DBW'
                              GROUP BY e.C_SE_ID
                             ) t
                        where cnt = maxcnt)
                       );
    

    除了修复连接之外,我还删除了对course_section 的所有引用。该表似乎没有被使用(除非用于过滤结果),删除它会隐含查询。

    【讨论】:

    • 应该返回三个值,但它只返回一个值?
    • 很抱歉打扰您,但这是在嵌套子查询中使用的,并且由于 * 返回太多值而引发错误。我将使用所有相关信息更新问题
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多