Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于最大查询的最长时间_Sql_Oracle_Top N - Fatal编程技术网

Sql 关于最大查询的最长时间

Sql 关于最大查询的最长时间,sql,oracle,top-n,Sql,Oracle,Top N,第1行错误: ORA-00904:“S”“存储区”:无效标识符 我分别在括号和max函数中运行查询,效果很好,但是如果我在第一行添加SELECT D.DOG\u ID、D.DOG\u NAME、S.STORE\u区域,它会显示错误,我不知道这有什么问题 谢谢您的查询给出了错误ORA-00904:“S”。“存储区”:无效标识符,因为表别名S在子查询中定义,而不是在外部查询中定义 如果删除别名,则会出现错误ORA-00937:没有单个组函数,因为您有一个聚合函数和多个未聚合的列,但没有相应的grou

第1行错误:

ORA-00904:“S”“存储区”:无效标识符

我分别在括号和max函数中运行查询,效果很好,但是如果我在第一行添加SELECT D.DOG\u ID、D.DOG\u NAME、S.STORE\u区域,它会显示错误,我不知道这有什么问题


谢谢

您的查询给出了错误
ORA-00904:“S”。“存储区”:无效标识符
,因为表别名
S
在子查询中定义,而不是在外部查询中定义

如果删除别名,则会出现错误
ORA-00937:没有单个组函数
,因为您有一个聚合函数和多个未聚合的列,但没有相应的
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;

虽然oracle拥有MySQL,但它们仍然是不同的产品在ANSI-92 SQL标准(25年前)中,用正确的ANSI
JOIN
语法替换了老式的逗号分隔表列表样式它的使用是不鼓励这个家庭作业的吗?@Shadow Oracle也拥有Java…但是他们不能对它做太多的干扰,因为它在开源中如此广泛。这将提供一个
ORA-00937:没有一个单独的组函数
。这将不会找到具有最长持续时间的单一狗约会,相反,它将找到最长持续时间对于每个商店区域的每只狗。@MT0也许你是对的,但我的答案是解决op的错误。我想这是他的问题。@Moudiz为什么我最终需要一个分组依据……是吗?@Yvonne因为你有
max()
你需要添加
group by
来使用max()函数,或者你有一个上面提到的MT0错误是的,它有效,它给了我一个时间,但我查看了所有的数据,有一些持续时间比给定的时间长,你知道为什么吗?为什么我们需要where条件呢?@Yvonne请提供一些示例数据(例如,将您的DDL/DML语句放入一个或另一个类似的网站)来说明问题。我猜不出是什么原因导致了这个问题。至于为什么
WHERE
子句-您需要最大值,因此这将其限制为单个(第一)行,子查询中的
ORDER BY
子句将最大持续时间行放在第一位,因此这将是唯一返回的行。尝试删除
WHERE
子句,您应该会看到它以持续时间降序返回所有行。注意:我的代码片段是在它们编辑出某些相关上下文之前的答案。
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 ;