直升机, 我有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'
答案 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
来指定如何选择使用哪个;或使用rank
或dense_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