2017-09-04 162 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