2017-04-18 510 views
0

我有一個包含2列OLD_VALUE和NEW_VALUE以及5行的表格。第一行有值(A,B)。其他行值可以是(B,C),(C,D),(E,D),(D,F)。我想用新值更新所有舊值(如何在Excel中進行查找)最終結果要求:以上示例中的最新值爲D,F。即D指向F.E和C指向D.B指向C並且A指向B.指向F的指針D是最後和最新的,並且在D,F之後不再有連續。所以(OLD_VALUE,NEW_VALUE)→(A,F),(B,F),(C,F),(D,F),(E,F)。我需要5行NEW_VALUE爲'F'。繼承的級別可以從1到x。在Excel中Vlookup函數的SQL邏輯/如何在SQL中執行Vlookup

+0

你怎麼了知道哪一行是'第一',這是'最後'?你有一個表示訂單的專欄嗎? – cha

+0

不,不幸的是,沒有表示訂單的列。 –

+0

所以如果你在Excel中這樣做,你會使用5個vlookups?問題不是很清楚...... –

回答

0

我認爲像下面這樣的遞歸CTE就是你要找的東西(父母是第二個值不是第一個值的行)。如果沒有父母需要定位,這可能會失敗(例如,如果您有A-> B,B-> C,C-> A,您將得不到結果),但它應該適用於您的情況:

DECLARE @T TABLE (val1 CHAR(1), val2 CHAR(2)); 
INSERT @T VALUES ('A', 'B'), ('B', 'C'), ('C', 'D'), ('E', 'D'), ('D', 'F'); 

WITH CTE AS 
(
    SELECT val1, val2 
    FROM @T AS T 
    WHERE NOT EXISTS (SELECT 1 FROM @T WHERE val1 = T.val2) 
    UNION ALL 
    SELECT T.val1, CTE.val2 
    FROM @T AS T 
    JOIN CTE 
     ON CTE.val1 = T.val2 
) 
SELECT * 
FROM CTE; 
+0

太棒了。這工作!非常感謝你的幫助! :) –

1

這是我使用的腳本的表:

declare @t as table(old_value char(1), new_value char(1)); 
insert into @t values('A','B') 
insert into @t values('B','C') 
insert into @t values('C','D') 
insert into @t values('E','D') 
insert into @t values('D','F') 

這需要用遞歸CTE完成。首先,您需要爲CTE定義一個錨點。這種情況下的錨點應該是具有最新值的記錄。這是我如何定義錨:

select old_value, new_value, 1 as level 
from @t 
where new_value NOT IN (select old_value from @t) 

這裏是遞歸的CTE我用來定位每一行的最新值:

;with a as(
select old_value, new_value, 1 as level 
from @t 
where new_value NOT IN (select old_value from @t) 
union all 
select b.old_value, a.new_value, a.level + 1 
from a INNER JOIN @t b ON a.old_value = b.new_value 
) 
select * from a 

結果:

old_value new_value level 
--------- --------- ----------- 
D   F   1 
C   F   2 
E   F   2 
B   F   3 
A   F   4 

(5 row(s) affected) 
+0

非常感謝!欣賞它! :) –

+0

我從中學到了一些東西,我一直認爲它必須從A到F,但是你在另一個方向上構建它。我必須記住這一點。 –