关于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 ;
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 ;