假设我的表@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
中的最低值变为x
中y
的最低@A
,然后是{{1}}。 )。
我觉得有一个相当简单的方法可以做到这一点,但我没有到达那里......
答案 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
它可能不优雅,但它有效