2013-05-15 53 views
0

我想創建一個sql查詢,它將返回出現在兩個表之間的最小的id,但是我不斷收到錯誤HAVING MIN(COUNT(E.C_SE_ID))。甲骨文表示,按功能分組嵌套得太深了。 我想不出另一種方式在s_idc_se_id鏈接報名表返回C_SE_IDSQL組函數嵌套太深

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)); 

的,我試圖獲取有關該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); 

回答

2

一種方式是通過嵌套查詢,然後選擇第一行中的輸出:

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。該表似乎不被使用(除非用於過濾結果),並且刪除它會隱含查詢。

+0

有三個值應該返回,但它只返回1值? – user1393064

+0

對不起,打擾你,但這是用於嵌套子查詢和它的拋出錯誤,因爲*返回太多的值。我會用所有相關信息更新這個問題 – user1393064