关于max query的最长时间

About the longest time by max query

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": invalid identifier

我把运行括号里的query和max函数分开,效果很好,但是如果我加上SELECT D.DOG_ID, D.DOG_NAME, S.STORE_AREA 第一行就报错,不知道哪里错了

谢谢

您的查询给出了错误 ORA-00904: "S"."STORE_AREA": invalid identifier,因为 table 别名 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;

如果你想要别名

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 ;