【发布时间】:2010-04-06 20:34:29
【问题描述】:
表 A
- tableAID
- tableBID
- 等级
表 B
- tableBID
- 姓名
- 说明
表 A 从两个表中的 tableBID 链接到表 b。
如果我想在表 A 中找到分数最高的行,对于表 B 中的每一行,我会这样编写查询:
select max(grade) from TableA group by tableBID
但是,我不只是想要成绩,我想要成绩加上该行的 id。
【问题讨论】:
表 A
表 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
【讨论】:
假设你只有一个 Max()(巨大的假设)你可以做 min(tableaid) where Grade = (select max(grade) etc....)
或者如果你想要所有匹配的 id
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)
【讨论】: