查找内部联接的最大值 - SQL

Posted

技术标签:

【中文标题】查找内部联接的最大值 - SQL【英文标题】:Finding Max Value on Inner Join - SQL 【发布时间】:2020-12-08 05:19:48 【问题描述】:

我有一个临时表,我们称之为#order,在这个表中,有多个订单历史记录并发生了变化。

我正在查看or_chgn 列的最大值,在上面的示例中,该列会随着对订单文件的所有更改进行缩放。

但是,当我编写查询时,我得到的结果是错误的。

查询

SELECT * 
FROM t.#ORDER
INNER JOIN (
    SELECT OR_ORDN, max(OR_CHGN) OR_CHGN
    FROM t.#ORDER
    GROUP BY OR_ORDN
    ) d
ON t.OR_ORDN = d.OR_ORDN 
and t.OR_CHGN = d.OR_CHGN

消息:

Msg 4104, Level 16, State 1, Line 16

The multi-part identifier "t.OR_ORDN" could not be bound.

Msg 4104, Level 16, State 1, Line 17

The multi-part identifier "t.OR_CHGN" could not be bound.

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

您需要在外部查询的from 子句中声明别名t,这样您就可以在JOINON 子句中引用它。

由于您的架构看起来已经被称为t,因此我正在更改别名以使事情更清楚:

SELECT * 
FROM t.#ORDER o  --> here
INNER JOIN (
    SELECT OR_ORDN, max(OR_CHGN) OR_CHGN
    FROM t.#ORDER
    GROUP BY OR_ORDN
) omax ON omax.OR_ORDN = o.OR_ORDN AND omax.OR_CHGN = o.OR_CHGN

解决这个每组最大 n 问题的另一种常用方法是使用相关子查询,它以某种方式简化了查询:

SELECT * 
FROM t.#ORDER o  
WHERE OR_CHGN = (
    SELECT MAX(o1.OR_CHGN) FROM t.#ORDER o1 WHERE o1.OR_ORDN = o.OR_ORDN
)

此查询将利用(OR_ORDN, OR_CHGN) 上的索引。

【讨论】:

啊,这么容易被忽视的项目,我没认出我的复制/粘贴,把它留在了行的# 之前。谢谢-Leo 有意思,以后有问题一定要参考这篇文章,后者看起来效率很高。

以上是关于查找内部联接的最大值 - SQL的主要内容,如果未能解决你的问题,请参考以下文章

查找具有相同内部表示的浮点数/双精度数的最小值/最大值

复合键中的右联接 - Access SQL

sql 内部联接的SQL更新

SQL Server-交叉联接内部联接基础回顾

在其中一个联接上选择具有最大值的记录

带有内部联接的sql更新和位置