关于最大查询的最长时间

时间:2017-10-12 11:26:19

标签: sql oracle top-n

SELECT 
    D.DOG_ID, D.DOG_NAME, S.STORE_AREA, MAX(DURATION) 
FROM 
    (SELECT 
         D.DOG_ID, D.DOG_NAME, S.STORE_AREA, SHD.START_TIME-END_TIME DURATION 
     FROM 
         SERVICE_HISTORY_DETAIL SHD, STORES S, DOGS D, SERVICE_HISTORY SH
     WHERE 
         D.DOG_ID = SH.DOG_ID 
         AND S.STORE_ID = SH.STORE_ID 
         AND SH.SERVICE_ID = SHD.SERVICE_ID);

第1行的错误:

  

ORA-00904:“S”。“STORE_AREA”:标识符无效

我分别在括号和max函数中运行查询,它运行良好,但如果我在第一行添加SELECT D.DOG_ID,D.DOG_NAME,S.STORE_AREA,则显示错误,我不知道是什么错了。

由于

2 个答案:

答案 0 :(得分:0)

您的查询提供错误ORA-00904: "S"."STORE_AREA": invalid identifier,因为表别名S是在子查询中定义的,而不是在外部查询中定义的。

如果删除别名,则会收到错误ORA-00937: not a single-group group function,因为您有一个聚合函数和几个未聚合的列,但您没有相应的GROUP BY子句。

一种解决方案是不使用聚合函数,而是在子查询中对结果进行排序,然后得到第一个(最大)结果:

SELECT * 
FROM   (
  SELECT D.DOG_ID,
        D.DOG_NAME,
        S.STORE_AREA,
        SHD.START_TIME-END_TIME DURATION 
  FROM   SERVICE_HISTORY_DETAIL SHD
        INNER JOIN SERVICE_HISTORY SH
        ON ( SH.SERVICE_ID = SHD.SERVICE_ID )
        INNER JOIN STORES S
        ON ( S.STORE_ID = SH.STORE_ID )
        INNER JOIN DOGS D
        ON ( D.DOG_ID = SH.DOG_ID)
  ORDER BY DURATION DESC
)
WHERE  ROWNUM = 1;

答案 1 :(得分:0)

如果你想要别名

SELECT 
   A.DOG_ID, A.DOG_NAME, A.STORE_AREA, MAX(A.DURATION) 
FROM 
    (SELECT 
         D.DOG_ID, D.DOG_NAME, S.STORE_AREA, SHD.START_TIME-END_TIME DURATION 
     FROM 
         SERVICE_HISTORY_DETAIL SHD, STORES S, DOGS D, SERVICE_HISTORY SH
     WHERE 
         D.DOG_ID = SH.DOG_ID 
         AND S.STORE_ID = SH.STORE_ID 
         AND SH.SERVICE_ID = SHD.SERVICE_ID) A group by  A.DOG_ID, A.DOG_NAME, A.STORE_AREA ;