我希望有一种不使用子查询的简单方法:
场景:您有一个包含“key”、“SubKey”和“Value”列的“ableA”。我需要获取给定“key”的Max(“SubKey”)的“值”。
因此,如果表中包含以下行:
KEY SUBKEY VALUE
1 1 100
1 2 200
1 3 300
对于key=1,我需要值300。我希望能做这样的事情:
SELECT
VALUE
FROM
TableA
WHERE
Key = 1
HAVING
SubKey = MAX(SubKey)
但这是行不通的。有没有办法在不执行“where SubKey=(Subselect For Max Subkey)”的情况下做到这一点?
8条答案
按热度按时间xzv2uavs1#
使用自联接:
这将返回具有匹配的子键值的所有值,以防存在倍数。
使用RANK&CTE(SQL Server 2005+):
这将返回具有匹配的子键值的所有值,以防存在倍数。
使用ROW_NUMBER&CTE(SQL Server 2005+):
这将返回一行,即使有多行具有相同的子键值...
使用top:
这将返回一行,即使有多行具有相同的子键值...
6ioyuze22#
非常简单,没有连接,没有子查询:
如果需要每个键的最大值:
z9gpfhce3#
hiz5n14c4#
我的天哪,小马撞上了大多数的方式。这里还有一条:
唯一一次T2.key为空的情况是在左联接中没有匹配项时,这意味着不存在具有更高子键的行。如果有多行具有相同(最高)的子键,这将返回多行。
tsm1rwdh5#
OMG Ponie的
ROW_NUMBER
方法在所有情况下都是最有效的方法,因为它不会在具有两个相同数量的MAX
值的情况下失败,返回比预期更多的记录,并破坏recordset
可能提供给您的插入。缺少的一件事是,当还存在多个键时,如何在必须返回与每个最大值相关联的子键的情况下执行此操作。只需将
summary
表与MIN
和GROUP
“本身”连接起来,就可以开始了。xe55xuns6#
如果您总是希望一个键值只有一行,而不是同时有多个键的答案,那么所有连接的东西都是无用的过度构建。只要使用OMG小马已经给你的前1个问题就行了。
lb3vh1jj7#
如果使用CTE的多个密钥:
ezykj2lf8#
可能是这样的: