【问题标题】:How can I rewrite subquery inside JOIN?如何在 JOIN 中重写子查询?
【发布时间】:2011-05-14 12:57:27
【问题描述】:

我对 SQL 不是很流利,我的问题是如何重写以下语句以使其看起来更自然。我正在尝试编写的select 连接了两个表——“users”和“stats”——并且我提前知道了用户的 id。这可能是非常基本的东西,但我还不是 SQL 忍者。

select
    u.id,
    sum(s.xxx)
from
    (
        select id from users where id in (100, 200, 300)
    ) u
    left join
    stats s
        on u.id = s.user_id
group by
    u.id
;

看起来很奇怪的部分是

    (
        select id from users where id in (100, 200, 300)
    ) u

建议我正确的方式。谢谢

【问题讨论】:

  • 您没有在此查询中使用任何来自 stats (s) 的字段,为什么要包含它?
  • 你是对的。我打错了:是sum(s.xxx)

标签: sql postgresql join subquery


【解决方案1】:

这是一种复杂的说法

....WHERE id in (100,200,300)

在您的WHERE 子句中。

整个事情可以重写为:

select
    u.id,
    sum(s.xxx)
from
    users u
left join stats s
    on s.user_id = u.id
where u.id in (100, 200, 300)
group by
    u.id

【讨论】:

  • 对不起。一个错字。要修复...它是sum(s.xxx)
  • @user466619 - 我为此更改了查询。
  • @JNK -- 当我在 IN 表达式中使用多个已知 id 时,它在拥有数千名用户的现有数据库上运行速度要慢得多
  • @user466619 - 这应该和你之前的查询一样快,如果不是更快的话。您不是使用IN 子句进行子选择,而是自己执行显式IN 子句。 IN 不是一般的超快速操作,但它可能是这里最好的解决方案。
  • @JNK -- 抱歉,现在它似乎和 :) 一样快:) 不过,有没有办法在整个表传递给 JOIN 之前过滤用户?对不起,如果这个问题没有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2021-04-23
  • 2017-06-10
  • 1970-01-01
  • 2014-09-27
相关资源
最近更新 更多