2015-09-28 73 views
1

我一直在试图写这个查询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); 
  • 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(*)); 
    
  • 00000 - “基团功能被嵌套太深”
  • 错误在最后一行中,塔25

    编辑:感谢gyus,你是要命,几乎所有的答复都在工作,但我必须选择一个...

    +0

    你想得到什么总数? –

    +1

    使用派生表或子选择。 – jarlh

    +0

    我想获得这些查询中最常用的驱动程序 – Alex

    回答

    2

    使用窗函数:

    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()代替,并得到具体哪一行,甚至如果多个驱动程序有相同的最大值。

    1

    试试这个。我按cnt降序排列。然后从中选择最上面一行。您可以将查询编辑为rownum <=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) 
    
    +0

    这个查询只返回一个驱动程序,athor需要所有最大值的驱动程序 – HAYMbl4

    +0

    编辑答案以符合您的要求。 – Utsav

    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) 
    
    1

    你有你的包裹查询到内联视图以便能够查询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);