2012-02-29 57 views
2

我想加入2个表,但只加入一组记录中的最新记录。加入两个表,只使用右表的最新值

左表:

部分

  • Part.PartNum

右表:

材料

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

的修订号开始于 “A” 和增加。

我想加入PartNum的2个表格,但只能加入右表的最新记录。我已经看到了其他的例子,但很难把它放在一起。

编辑:

我发现了第一个版本号是“新建”,然后它增加A,B,......它永远不会超过一个或两个版本,所以我不担心会在序列上。但是,如何选择最新版本是'New'作为第一个版本号?

+0

请注明你所使用的SQL Server版本。 – 2012-02-29 15:50:44

+1

RevisionNum如何增加?它总是一个单一的字符?如果是这样,第27次修订会发生什么? – SupremeDud 2012-02-29 15:53:02

+0

检查编辑。 – Jason 2012-02-29 16:43:56

回答

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之后发生的情况,最大(修订号)可能会中断。


编辑:

如果RevisionNum序列总是开始瓦特/ 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

+0

这不再工作,检查我的编辑。 – Jason 2012-02-29 16:38:10

+0

查看补充。这很混乱 - 我想一定有更好的方法 - 也许我会在午餐时想起它! – 2012-02-29 17:16:39

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后自带)?

+0

这工作。你能花一分钟来解释它为什么起作用吗? – Jason 2012-02-29 16:00:40

+0

@Jason - 查看:http://msdn.microsoft.com/en-us/library/ms189461.aspx – 2012-02-29 16:04:03

+0

这不再有效,请查看我的编辑。 – Jason 2012-02-29 16:38:04

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