将一个表中的一系列值应用于另一个表中的一系列行

时间:2014-11-25 13:39:43

标签: sql-server tsql sql-server-2012

假设我的表@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更新@B,因此它有:

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

...理想情况是按此顺序排列(例如,@B中的最低值变为xy的最低@A,然后是{{1}}。 )。

我觉得有一个相当简单的方法可以做到这一点,但我没有到达那里......

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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

它可能不优雅,但它有效