表獲得從基於一組的行的ID的SQL - 通過
- tableAID
- tableBID
- 級
表B
- tableBID
- 名稱
- 描述
表A從tableBID鏈接表B兩個表中找到。
如果我想找到在表A行,其中有檔次最高,爲表B中的每一行,我會寫這樣我的查詢:
select max(grade) from TableA group by tableBID
不過,我不只是想要成績,我想要該成績加上該行的ID。
表獲得從基於一組的行的ID的SQL - 通過
表B
表A從tableBID鏈接表B兩個表中找到。
如果我想找到在表A行,其中有檔次最高,爲表B中的每一行,我會寫這樣我的查詢:
select max(grade) from TableA group by tableBID
不過,我不只是想要成績,我想要該成績加上該行的ID。
你可以嘗試像
SELECT a.*
FROM TableA a INNER JOIN
(
SELECT tableBID,
MAX(grade) MaxGrade
FROM TableA
GROUP BY tableBID
) B ON a.tableBID = B.tableBID AND a.grade = B.MaxGrade
使用SQL Server 2005 ROW_NUMBER功能,你也可以嘗試
SELECT tableAID,
tableBID,
grade
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY tableBID ORDER BY grade DESC) RowNum
FROM @TableA
) A
WHERE a.RowNum = 1
假設你只會有一個最大()(巨大的假設),你可以做分(tableaid),其中等級=(選擇最大(級)等....)
,或者如果你想所有匹配的IDS
SELECT TableAID, Grade
FROM TableA INNER JOIN (SELECT tableBID,
MAX(grade) Grade
FROM TableA
GROUP BY tableBID) MaxGrade
ON TableA.Grade = MaxGrade.Grade
只要用一點點自我參照NOT EXISTS子句:
DECLARE @tableA TABLE (tableAID int IDENTITY(1,1), tableBID int, grade int)
INSERT INTO @tableA(tableBID, grade) VALUES(10, 1)
INSERT INTO @tableA(tableBID, grade) VALUES(10, 3)
INSERT INTO @tableA(tableBID, grade) VALUES(20, 4)
INSERT INTO @tableA(tableBID, grade) VALUES(20, 8)
INSERT INTO @tableA(tableBID, grade) VALUES(30, 10)
INSERT INTO @tableA(tableBID, grade) VALUES(30, 6)
SELECT tableAID, grade
FROM @tableA ta
WHERE NOT EXISTS (SELECT 1 FROM @tableA WHERE tableBID = ta.tableBID AND grade > ta.grade)