【问题标题】:Using INNER JOIN resulting table in another INNER JOIN在另一个 INNER JOIN 中使用 INNER JOIN 结果表
【发布时间】:2022-01-04 13:20:43
【问题描述】:

我不确定标题是否真的对应,也许我的方法是错误的。

我有以下数据库结构:

TABLE producers
    id

TABLE data
    id
    date 
    value 
    producer_id OneToMany

首先,对于每个生产者,我想获得最新的date 注册data。下面的代码正是这样做的:

SELECT producers.id AS producer_id, max.date AS max_date
FROM producers
INNER JOIN data ON producers.id = data.producer_id
INNER JOIN (
    SELECT producer_id, MAX(date) AS date
    FROM data
    GROUP BY producer_id
) AS max USING (producer_id, date)

结果表是:

----------------------------------------------------
|   producer_id   |             max_date           |
----------------------------------------------------
|       5         |  2022-01-01 01:45:00.000 +0000 |
|       7         |  2022-01-01 01:45:00.000 +0000 |
|       14        |  2022-01-01 01:45:00.000 +0000 |
|       15        |  2022-01-01 01:45:00.000 +0000 |
|       17        |  2022-01-01 01:45:00.000 +0000 |
----------------------------------------------------

接下来我需要的是SUM 每个生产者的所有data 记录WITH date 大于我们在INNER JOIN 之后为每个生产者获得的max_date 来自上一个查询。 SUM() 将在列 value 上执行。

希望这很清楚,如果没有,请告诉我。我已经尝试做另一个INNER JOIN 并在WHERE 子句中使用表max,但我收到一个错误,告诉我该表在那里,但不可能在查询的那部分中使用.

也许另一个INNER JOIN 不是解决方案。在这里,我受限于我对 SQL 的了解,我真的不知道要更深入地阅读哪些关键字以了解什么是最好的方法以及如何去做。因此,将我重定向到最佳路径的信息将非常有帮助。

提前致谢。

编辑:忘记指定SUM() 将在哪个列上执行。

编辑 2:刚刚意识到我在这里要问的是,结果将始终是一个空表,因为永远不会有 date 更大的记录。当我编写数据库的简化版本时,忘记添加表/连接,这就是原因。但最后 imo 方法/解决方案仍然是相同的,只是应用于不同的表。再次抱歉。

【问题讨论】:

  • 你要去哪个栏目sum()
  • @etch_45 哦抱歉忘了提,value
  • 您的第一个查询可以很简单:sqlize.online/sql/psql14/44dd5bc0ba728fdd12a58b77c08c7fc4
  • 好点,但在我的真实场景中,除了这个我还做了其他INNER JOINs,所以这就是我不能这样做的原因。但我会记住的,谢谢。
  • 请:如果您有答案,请尽可能发表最好的问题。不要取消您的问题,也不要在其中编辑答案。但不要以使发布的答案无效的方式进行编辑。 How to Ask How to Answer Help center Meta Stack Overflow Meta Stack Exchange 对于代码问题,请给minimal reproducible example。请不要包括问候、道歉等。请不要插入“编辑”等词或以其他方式说您已编辑,只需编辑到最佳演示文稿即可。

标签: sql postgresql join


【解决方案1】:

使用distinct onorder by可以大大简化问题中的第一个查询:

select distinct on (p.id)
       p.id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc;

至于“对每个生产者的所有数据记录求和,日期大于 max_date”——嗯,没有一个日期大于最新的。这是一个这样做的查询(即使结果将为空)

select producer_id, sum(value)
from data d inner join -- the query above follows
(
  select distinct on (p.id)
         p.id producer_id, d.date
  from producers p
  join data d on p.id = d.producer_id
  order by p.id, d.date desc
) t using (producer_id)
where d.date > t.date
group by producer_id;

【讨论】:

  • 顺便说一下,第一个查询可以比我的更简单,正如@SlavaRozhnev 在他的评论中所建议的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多