2012-02-29 28 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