2014-11-25 62 views
1

假設我有表@A,其中有一系列行,其中有一行包含NULL值,對於這些行,我有表@B(可能更少,或者更多)行的值,如何將@B的值應用於@A的行以填充NULL,而不更改@B? (我沒有使用遊標,我的意思是:遊標相當平凡)@A@B都是內存中的(表變量),只有少量的行,所以我們不必擔心大數據集。將一個表中的一系列值應用到另一個表中的一系列行中

例如,如果我有:

DECLARE @A TABLE 
(
     x INT, 
     y NVARCHAR(20) 
) 
INSERT INTO @A (y) VALUES ('aaa'), ('bbb'), ('ccc') 

DECLARE @B TABLE 
(
     x INT 
) 
INSERT INTO @B (X) values (1), (2) 

現在我有@A

 
x   y 
----------- ----------- 
NULL  aaa 
NULL  bbb 
NULL  ccc 

@B

 
x 
----------- 
1 
2 

...我想更新@A基於所以它有:

 
x   y 
----------- ----------- 
1   aaa 
2   bbb 
NULL  ccc 

...理想地以該順序(例如,在@B最低值變爲x用於@A最低y,那麼下一個,等等)。

我覺得有一個相當簡單的方法來做到這一點,但我沒有收到有...

回答

2

此查詢將有助於獲得預期的結果。

DECLARE @A TABLE 
(
     x INT, 
     y VARCHAR(10) 
) 
INSERT INTO @A (y) SELECT ('aaa') UNION SELECT('bbb') UNION SELECT('ccc') 

DECLARE @B TABLE 
(
     x INT 
) 
INSERT INTO @B (X) SELECT (1) UNION SELECT (2) 


UPDATE A SET x = B.x FROm 
    (SELECT *, ROW_NUMBER() OVER (ORDER BY y) AS RoW1 FROM @A) AS A 
    INNER JOIN 
    (SELECT *, ROW_NUMBER() OVER (ORDER BY x) AS RoW1 FROM @B) AS B 
    ON A.RoW1 = B.RoW1 

SELECT * FROm @A 
+0

他改變了他的問題,但你的查詢仍然有效 – Jaques 2014-11-25 13:51:09

+0

非常好,謝謝 - 我想'ROW_NUMBER'可能會進入它的某處... – 2014-11-25 13:56:44

+0

@GerethD,你忘記了你的其他部分=在連接中,我修復了它雖然你 – Jaques 2014-11-25 13:58:00

-1

這個工作

DECLARE @A TABLE 
(
     x INT, 
     y NVARCHAR(20) 
) 
INSERT INTO @A (y) VALUES ('aaa'), ('bbb'), ('ccc') 

DECLARE @B TABLE 
(
     x INT 
) 
INSERT INTO @B (X) values (1), (2) 

Select * into #X from @B 
DECLARE @Val1 INT 
WHILE 0 < (Select COUNT(*) from #X) 
    BEGIN 
    SET ROWCOUNT 1 
    Select @Val1 = MIN(x) from #X 
    UPDATE @A set x = @Val1 where y = (Select MIN(y) from @A where x is null) 
    Delete #X where x = @Val1 
    if 0 = (Select Count(*) from @A where x is null) 
    break 

    END 
SET ROWCOUNT 0 
Select * from @A 

它可能不是優雅,但它的工作原理

+0

謝謝。創造性。 :-)對不起,但我沒有想到在問題中說「不改變@ B'」;我現在補充一下。 – 2014-11-25 13:53:47

+0

我改變了它,但我認爲其他答案更好 – Jaques 2014-11-25 13:55:44

+0

不知道爲什麼有人會倒下它。它回答了這個問題,我沒有說它是完美的代碼。有些人只是喜歡downvote – Jaques 2014-11-25 13:57:02

相關問題