oracle组相关子查询

时间:2016-02-08 22:49:14

标签: sql oracle subquery correlated-subquery

直升机, 我有2个简单的表格,我必须进行一个查询,其中包括行" GRO"来自PROD并返回" gro"最常用的是coid。我尝试使用子查询,但我有错误,我不知道如何将此查询转换为工作。

请帮帮我:)。

我使用的是Oracle SQL。

TABLE CO

ID |name|param|
---+----+-----+
1  |AA  | X   |
2  |BB  | X   |
3  |CC  | X   |
4  |DD  | X   |
5  |EE  |     |

表格PROD

id| coid |gro
--+------+------
1 |  1   | a
2 |  1   | a
3 |  1   | b
4 |  1   | c
5 |  1   | d
6 |  2   | b
7 |  2   | c
8 |  2   | c
9 |  3   | a
10|  3   | a
11|  4   | b
12|  4   | b
13|  4   | b
14|  4   | a
15|  1   | a

结果

ID |name|best_gro|
---+----+--------+
1  |AA  | a      |
2  |BB  | c      |
3  |CC  | a      |
4  |DD  | b      |

我的查询

select c.id, c.name,
(
    select gro from(
    SELECT  GRO, count(GRO) as m FROM HR.PROD pro
      where coid = c.id        --<------ ERROR 
    group by gro order by m desc
    ) where rownum <=1
) as best_gro

from HR.co c 
where c.param = 'X'

2 个答案:

答案 0 :(得分:1)

您无法在下面的c列中引用多个子查询级别。

您可以使用分析row_number()函数通过连接重写此内容,例如:

select id, name, gro
from (
  select id, name, gro,
    row_number() over (partition by id, name order by cnt desc) rnk
  from (
    select c.id, c.name, p.gro, count(*) as cnt
    from HR.co c
    join HR.prod p on p.coid = c.id
    where c.param = 'X'
    group by c.id, c.name, p.gro
  )
)
where rnk = 1

取决于你想要对关系做什么 - 如果两个或多个gro值具有相同的计数 - 你需要order by来指定如何选择使用哪个;或使用rankdense_rank代替row_number来获取所有相关值。

或者您可以使用更短的keep dense rank方法。

答案 1 :(得分:0)

谢谢Alex, 我修改了一点,我得到了正确的结果!

select id, name, gro from(
          select id, name, gro,
            rank() over (partition by coid order by cnt desc) rnk
          from (
            select c.id, c.name, p.gro, p.coid, count(*) as cnt
            from HR.co c
            join HR.prod p on p.coid = c.id
            where c.param = 'X'
            group by c.id, c.name, p.gro, p.coid   
          )
          )
      where rnk = 1