簡體   English   中英

無效標識符錯誤,Oracle

[英]Invalid identifier error, Oracle

我一直在嘗試編寫這個查詢 1 小時,但 SQL Developer 總是拋出錯誤。

SELECT d.driver_name, COUNT(*) AS cnt
  FROM Drivers d
  JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
  GROUP BY d.driver_name
  HAVING cnt = MAX(cnt);
  1. 00000 - "%s: 無效標識符"

錯誤在最后一行,第 20 列。

所以我想出了另一個解決方案,但拋出了另一個錯誤:

SELECT d.driver_name, COUNT(*) as cnt
  FROM Drivers d
  JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
  GROUP BY d.driver_name
  HAVING COUNT(*) = MAX(COUNT(*));
  1. 00000 - “組函數嵌套太深”

錯誤在最后一行,第 25 列。

編輯:謝謝gyus,你太棒了,幾乎所有的回復都有效,但我必須選擇一個......

使用窗口函數:

SELECT driver_name, cnt
FROM (SELECT d.driver_name, COUNT(*) AS cnt,
             MAX(COUNT(*)) OVER () as MAXcnt
      FROM Drivers d JOIN
           Fastest_laps fl
           ON d.ID_driver = fl.ID_driver
      GROUP BY d.driver_name
     ) d
WHERE cnt = MAXcnt;

您也可以使用RANK()DENSE_RANK()來表達這一點:

SELECT driver_name, cnt
FROM (SELECT d.driver_name, COUNT(*) AS cnt,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM Drivers d JOIN
           Fastest_laps fl
           ON d.ID_driver = fl.ID_driver
      GROUP BY d.driver_name
     ) d
WHERE seqnum = 1;

這種方法的優點是您可以改用ROW_NUMBER()並獲得准確的一行,即使多個驅動程序具有相同的最大值。

嘗試這個。 我按cnt降序排列。 然后從中選擇頂行。 您可以將查詢編輯為rownum <=2以獲取前 2 行,依此類推。

           with tbl1 as
           (SELECT d.driver_name as driver_name, COUNT(*) AS cnt
            FROM Drivers d
            JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
            GROUP BY d.driver_name
            order by cnt desc
            )
            select driver_name,cnt from tbl1
            where cnt = (select cnt from tbl1 rownum=1)

我不確定 Oracle 是否支持這一點,但請試一試:

SELECT d.driver_name, COUNT(*) as cnt
FROM Drivers d
  JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
GROUP BY d.driver_name
ORDER BY cnt DESC
FETCH FIRST 1 ROW WITH TIES

或者使用公用表表達式:

with cte as
(
SELECT d.driver_name as driver_name, COUNT(*) AS cnt
FROM Drivers d
  JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
GROUP BY d.driver_name
)
select driver_name, cnt
from cte
where cnt = (select max(cnt) from cte)

您必須將查詢包裝到內聯視圖中才能查詢cnt

select *
from   (
         SELECT d.driver_name, COUNT(*) AS cnt
         FROM Drivers d
         JOIN Fastest_laps fl ON d.ID_driver = fl.ID_driver
         GROUP BY d.driver_name
       ) x
group
by     driver_name, cnt
having cnt = MAX(cnt);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM