我的查询在没有MAX(colName)行的情况下运行正常.原始查询选择大约100列,但现在需要添加MAX(colName)列.显然,当我添加它们时,MS SQL会抱怨错误:
"Column 'applicationId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"
有没有办法添加这些计算值列而不必更改select中的其他100列?下面的示例已经过简化,但原始查询更大更复杂.
SELECT
g.applicationId,
-- (another 100 or so columns just like above)
-- max(g.AScore) as AScore,
-- max(g.APercentile) as APercentile
FROM application a
LEFT JOIN GREScores g ON a.applicationId = g.applicationId
WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)
谢谢
UPDATE
看起来像@OVais提到的子查询方法就可以了.如果您认为这不是一个好方法,请告诉我原因:
SELECT
g.applicationId,
-- (another 100 or so columns just like above)
(SELECT MAX(AScore) FROM GREScores WHERE GREScores.applicationId = a.applicationId) AS tAScore
-- max(g.APercentile) as APercentile
FROM application a
LEFT JOIN GREScores g ON a.applicationId = g.applicationId
WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)
GROUP BY用于确保查询在语义上是正确的.如果您对column56有14个不同的值,那么该怎么办:SQL Server 猜测您希望输出中有14行或者崩溃到MAX?
SQL标准要求填充GROUP BY(主流RDBMS,只有MySQL没有并且猜测解决了歧义).
现在,有办法解决这个问题:
编辑:
我上面的答案是"每列100列的MAX".
如果您想要"所有行,所有行都有一个MAX",那么您可以使用窗口
SELECT
g.applicationId,
-- (another 100 or so columns just like above)
max(g.AScore) OVER () as AScore,
max(g.APercentile) OVER () as APercentile
FROM GREScores g
WHERE g.applicationID = 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26769 次 |
| 最近记录: |