詢問:
SELECT
ID, Name, Component, Version
FROM
modules
WHERE
modules.ValidTo > NOW() AND modules.ValidFrom < Now();
回傳:
| ID | 姓名 | 成分 | 版本 |
|---|---|---|---|
| 12 | TC1 | 一種 | 1.0.0 |
| 13 | TC2 | 乙 | 1.0.0 |
| 15 | TC3 | C | 1.2.0 |
| 17 | TC3 | C | 1.2.5 |
所需資料(按組件分組但回傳最高版本的記錄):
| ID | 姓名 | 成分 | 版本 |
|---|---|---|---|
| 12 | TC1 | 一種 | 1.0.0 |
| 13 | TC2 | 乙 | 1.0.0 |
| 17 | TC3 | C | 1.2.5 |
我試過這個查詢
SELECT
modules.ID, modules.Name, modules.ComponentIdentifier,
EXEName, MAX(Version)
FROM
modules
WHERE
modules.ValidTo > NOW() AND modules.ValidFrom < Now()
GROUP BY
modules.ComponentIdentifier;
但它回傳錯誤的 ID。我需要 ID 17 而不是 15。
| ID | 姓名 | 成分 | 版本 |
|---|---|---|---|
| 12 | TC1 | 一種 | 1.0.0 |
| 13 | TC2 | 乙 | 1.0.0 |
| 15 | TC3 | C | 1.2.5 |
如何解決這個問題?
uj5u.com熱心網友回復:
您以不正確的方式使用 group by ......通常不允許選擇未在 group by 中提及的未聚合列。在某些資料庫中,這允許(mysql versione <5.7 或 ONLY_FULL_GROUP_BY 禁用)但會產生不可預測的結果,
那么如果您無法將聚合函式添加到未在組中修正的列中,
您需要子查詢來過濾正確的值
select modules.ID, modules.Name, modules.ComponentIdentifier,
EXEName, a.max_ver
from (
SELECT
modules.ComponentIdentifier,
MAX(Version) max_ver
FROM modules
WHERE modules.ValidTo > NOW() AND modules.ValidFrom < Now()
GROUP BY modules.ComponentIdentifie
) a
INNER JOIN modules on modules.ComponentIdentifier = a.ComponentIdentifier
and a.max_ver= modules.Version
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358152.html
標籤:sql
上一篇:如何將資料串列插入到AzureSQL/SQLServer中的單列行?
下一篇:在僅表日期中插入40年的記錄
