加入两个表,只使用右表的最新值

时间:2012-02-29 15:48:03

标签: sql sql-server sql-server-2008 join

我正在尝试加入2个表,但只加入一组记录中的最新记录。

左表:

部分

  • Part.PartNum

右表:

材料

  • Material.Partnum
  • Material.Formula
  • Material.RevisionNum

修订号从“A”开始并增加。

我想通过PartNum加入2个表,但只能加入右表中的最新记录。我已经看过其他关于SO的例子,但很难将它们放在一起。

编辑:

我发现第一个修订号是“新”,然后它增加A,B,......它永远不会超过一个或两个修订,所以我不担心重复序列。但是,如何选择最新的“新”作为第一个修订号?

3 个答案:

答案 0 :(得分:5)

如果是SQL Server 2005 +

;WITH m AS 
(
   SELECT Partnum, Formula, RevisionNum,
     rn = ROW_NUMBER() OVER (PARTITION BY PartNum ORDER BY 
       CASE WHEN RevisionNum ='New' THEN 1 ELSE 2 END)
     FROM dbo.Material
)
SELECT p.PartNum, m.Formula, m.RevisionNum
FROM dbo.Parts AS p
INNER JOIN m ON p.PartNum = m.PartNum
WHERE m.rn = 1;

虽然很好奇,但如果有超过26次修订(例如Z之后的内容),你会怎么做?

答案 1 :(得分:4)

运行它的一般SQL语句是:

select P.PartNum, M.Formula, M.RevisionNum
from Parts P
join Material M on P.PartNum = M.PartNum
where M.RevisionNum = (select max(M2.RevisionNum) from Material M2
                       where M2.PartNum = P.PartNum);

重复上述关于修订版#26之后发生的事情的警告。根据#26之后发生的情况,max(RevisionNum)可能会中断。


编辑:

如果RevisionNum序列始终以w / NEW开始然后继续,A,B,C等,那么max()需要被替换为更复杂(和凌乱)的东西:

select P.PartNum, M.RevisionNum
from Parts P
join Material M on P.PartNum = M.PartNum
where (
      (select count(*) from Material M2 
              where M2.PartNum = P.PartNum) > 1
      and M.RevisionNum = (select max(M3.RevisionNum) from Material M3
                   where M3.PartNum = P.PartNum and M3.RevisionNum <> 'NEW')
      )
      or ( 
      (select count(*) from Material M4
              where M4.PartNum = P.PartNum) = 1
       and M.RevisionNum = 'NEW'
      )

必须有更好的方法来做到这一点。但这有效 - 必须考虑更快的解决方案。

SQL小提琴:http://sqlfiddle.com/#!3/70c19/3

答案 2 :(得分:1)

SQL Server 2005+以及:

已更新以处理OP更改要求

SELECT P.PartNum,
       M.Formula,
       M.RevisionNum
FROM Part AS P
CROSS APPLY (
    SELECT TOP 1 *
    FROM Material AS M
    WHERE M.Partnum = P.PartNum
    ORDER BY CASE WHEN RevisionNum ='New' THEN 2 ELSE 1 END,
             M.RevisionNum DESC
) AS M