oracle 1407.以运行时错误结束的顶级旅行者

bvk5enib  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(209)

我尝试了1407.Top Travellers。但是我在下面的Oracle查询中挣扎,'Runtime error'。有点太累了,不知道为什么。知道我哪里出错了吗?最近对SQL已经生疏了。

select name as name, 
case when rides.distance is null then 0 else sum(rides.distance) end as travelled_distance
from users
left join rides
on users.id = rides.user_id
group by rides.users_id
order by travelled_distance desc, name;
cgvd09ve

cgvd09ve1#

正如评论所说的,则是另一种说法:

select 
  name,
  sum(case when rides.distance is null then 0 else rides.distance end) as travelled_distance
from users left join rides on users.id = rides.user_id
group by name
order by travelled_distance desc, name;

或者,更简单的方法是使用nvl函数:

select 
  name,
  sum(nvl(rides.distance, 0)) as travelled_distance
from ...

不过,还有一些反对意见:

  • 您应该使用表别名(因为它们简化了查询并提高了可读性)
  • 此外,您应该在all列名前面加上表别名;在您的示例中,您未能对name列执行此操作。它 * 可能 * 属于users表,但我们无法确定,因为我们没有您的数据模型,也无法访问您的数据库
  • group by子句应包含未聚合的列。在您的查询中,该列为name列。您 * 可以 * 将rides.users_id放入该子句中,但必须name放入其中
1cosmwyk

1cosmwyk2#

下面的解决方案是有效的。感谢leetcode上的一个讨论帖子,我可以弄清楚这个问题:

select r.name, 
case when x.td is null
then 0
else x.td
end travelled_distance
from Users r
left join
(
    select user_id, sum(distance) td
    from Rides 
    group by user_id
) x
on r.id = x.user_id
order by travelled_distance desc,  r.name;

相关问题