2016-06-16 97 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