使用此查询,我可以找到拥有最多专利的公司的公司受让人编号,但我似乎无法打印公司名称。
SELECT count(*), patent.assignee
FROM Patent
GROUP BY patent.assignee
HAVING count(*) =
(SELECT max(count(*))
FROM Patent
Group by patent.assignee);
COUNT(*)--- ASSIGNEE
9 19715
9 27895
将查询嵌套到
中SELECT company.compname
FROM company
WHERE ( company.assignee = ( *above query* ) );
会给出“太多值”的错误,因为有两家公司拥有最多的专利但是上面的查询在WHERE子句中只占用一个受让人编号。我该如何解决这个问题?我需要打印受让人编号为19715和27895的BOTH公司名称。谢谢。
答案 0 :(得分:0)
在许多数据库中对另一个聚合函数(如.rst
)应用聚合函数是非法的,但我相信使用max(count(*))
运算符而一个联接来获取公司名称将解决您的问题。 / p>
试试这个:
ALL
答案 1 :(得分:0)
您已经开始使用嵌套查询的路径了。您需要做的就是删除COUNT(*)
:
SELECT company.compname
FROM company
WHERE company.assignee IN
(SELECT patent.assignee
FROM Patent
GROUP BY patent.assignee
HAVING count(*) = (SELECT max(count(*))
FROM Patent
GROUP BY patent.assignee
)
);
我不会这样写这个查询。 max(count(*))
的使用特别棘手,但它是有效的Oracle语法。
答案 2 :(得分:0)
假设您有Oracle,我对此的看法有所不同:
select
c.compname
from
company c
join
(
select
assignee,
dense_rank() over (order by count(1) desc) rnk
from
patent
group by
assignee
) p
on p.assignee = c.assignee
where
p.rnk = 1
;
我喜欢这个因为是让你找到任何等级。例如,如果你想要前3,你只需要将p.rnk = 1更改为p.rnk< = 3.如果你想要第10位,你只需将它改为p.rnk = 10.添加总数和等级从这里进入结果也很容易。总的来说,我认为它更通用。