2017-09-04 103 views
-1

我有2个表PORT和发货。我必须选择对应于最大(计数)的名称。它会为别名“A”引发错误。这段代码或其他可用的替代品是否有错误?Oracle子查询

select name from 
    (
    select name, count(name) as countval from 
    (
    select p.name from port p 
    inner join shipment s on p.id =s.departure_port_id 
    ) 
    group by name 
    order by countval desc 
     ) A 
     where countval=(select max(countval) from A)); 
+0

标题是无意义的,包含错误的错误信息是缺少的。但是如果Oracle抛出一个错误,我会假设代码中有错误。 – miracle173

回答

1

您可以使用rank窗口功能。如果有最大数量的关系,结果会给你多个名字。

select name from (
select p.name,rank() over(order by count(*) desc) as rnk 
from port p 
join shipment s on p.id =s.departure_port_id 
group by p.name 
) t 
where rnk=1 
+0

谢谢你,,,如果你可以建议一种方法来使用最大和最小函数检索ans会很感激。 – sudhakar

0

如果你想使用具有阻燃过滤结果,你可以使用

select name from (
    select p.name, count(p.name) my_count from port p 
    inner join shipment s on p.id =s.departure_port_id 
    group by p.name) t 
having t.my_count = max(t.my_count) 
group by name 
+0

整体语法看起来不对。无论“t”是什么,你在“GROUP BY”子句之前都有一个“HAVING”子句吗?也许你打算写点别的东西? – mathguy

+0

感谢宇..但我得到下面的错误 SQL ERROR: 组按名称)吨 * ERROR第4行: ORA-00918:列定义的含糊 – sudhakar

+0

SQL ERROR: 组按名称)吨 * 错误在第4行: ORA-00918:列模糊定义 – sudhakar

1

你想与大多数出货端口的端口名称?这可以在几个关系的情况下。一种方法是汇总运输表以获取这些端口号并使用这些端口号来选择端口名称。这是甲骨文12C:

select name 
from port 
where id in 
(
    select departure_port_id 
    from shipment 
    group by departure_port_id 
    order by count(*) desc 
    fetch first 1 row with ties 
); 

在早期版本中,你将使用RANK而不是排名侑装运聚集,这是略少可读性。例如:

select name 
from port 
where (id, 1) in 
(
    select departure_port_id, rank() over (order by count(*) desc) 
    from shipment 
    group by departure_port_id 
); 
+0

使用'rank()'与半连接的好方法! – mathguy