2010-04-06 54 views
2

表獲得從基於一組的行的ID的SQL - 通過

  • tableAID
  • tableBID

表B

  • tableBID
  • 名稱
  • 描述

表A從tableBID鏈接表B兩個表中找到。

如果我想找到在表A行,其中有檔次最高,爲表B中的每一行,我會寫這樣我的查詢:

select max(grade) from TableA group by tableBID 

不過,我不只是想要成績,我想要該成績加上該行的ID。

回答

2

你可以嘗試像

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 
0

假設你只會有一個最大()(巨大的假設),你可以做分(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 
0

只要用一點點自我參照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)