2016-06-16 159 views
0

我有如下關係:嵌套GROUP BY查詢

C(ID,N) I(ID,G) IB(I_id,C_ID,R)

我想列出所有的 「N」從關係 「C」,其中它們的r等於 'H' 和最大的 「g」 等於 'T'

樣本數據將是如下:

C:
C_ID, Ñ

C1,N1
C2,N2
C3,N3


IB:
C_ID,I_ID,R

C1,I1,H
C1, i2,H
c1,i3,N max H對於c1是t並且m
C2,I1,N
C2,I2,H
C2,I3,爲C2 N MAX H是米
C3,I1,H
C3,I2,H
C3,I3,H最大值H表示C3是叔


I:
I_ID,G

I1,叔
I2,米
I3,叔


對於此示例數據C1和C3具有 'T'

下面的查詢是一個答案最大 'H',但是它似乎未優化且非常重:

SELECT c1.n 
FROM I ib1, C c1, I i1 
WHERE i1.I_ID = ib1.I_ID 
AND i1.g IN 
(SELECT i.g 
FROM IB ib, C c, I i 
WHERE i.id = ib.I_id 
AND c.id = ib.C_id 
AND ib.r = 'H' 
AND i.g = 't' 
AND c.id = c1.id 
GROUP BY i.g, c.id 
HAVING COUNT(*)=(
SELECT max(COUNT(*)) 
FROM IB ib, C c, I i 
WHERE i.id = ib.I_id 
AND c.ID = ib.C_id 
AND ib.r = 'H' 
AND c.id = c1.id 
GROUP BY i.g, c.id)) 
GROUP BY c1.id, c1.name; 

很高興讓我知道什麼是其他poss Ible解決方案以及如何優化我的查詢。此外,我的桌子設計也是值得幫助的。 謝謝

+1

不清楚「最大」g「等於't'」最大g每c.id其中ib.r ='H'?什麼給你SELECT MAX(COUNT(*))? – Mottor

+0

使用WITH子句或分析函數 – Thomas

+0

但是,有些事情還不清楚......您正在連接表I兩次,表C正在與哪個表連接?它的笛卡兒加入... – Thomas

回答

1

如果我理解正確,通過我們得到的計數每c.id,ig,然後我們按行數降序排列,我們只得到ig ='t的第一行'

SELECT DISTINCT c1.n 
    FROM C c1 
WHERE c1.c_id IN (SELECT DISTINCT x.c_id 
        FROM (SELECT c_id, g, RANK() OVER (PARTITION BY c_id ORDER BY cnt DESC) rnmbr 
          FROM ( SELECT c.c_id, i.g, COUNT (*) cnt 
            FROM IB ib, C c, I i 
            WHERE i.i_id = ib.I_id AND c.c_ID = ib.C_id AND ib.r = 'H' 
           GROUP BY i.g, c.c_id)) x 
        WHERE g = 't' AND rnmbr = 1) 
+0

只需要在「DISTINCT c1.id」處進行小修改,它是DISTINCT x.id,因爲您的別名:) – Thomas

+0

@Thomas謝謝 – Mottor

+0

對不起,裏面有錯誤。現在應該工作。 – Mottor