我遇到了一个问题,我不确定这是否是预期的行为。我在网上搜索了答案,但我所能找到的只是关于最后更新的行以及查询后的值是多少。我知道在这种情况下不存在订单之类的东西,并且您无法提前确定其价值是多少。
但就我而言,我正在更新不同的列,因此覆盖以前的更新不是我关心的问题。
CREATE TABLE #original (id int, value1 int, value2 int)
INSERT INTO #original (id) VALUES (1), (2)
CREATE TABLE #temp (id int, name varchar(10), value int)
INSERT INTO #temp (id, name, value) VALUES (1, 'value1', 10), (1, 'value2', 11), (2, 'value1', 20), (2, 'value2', 21)
SELECT * FROM #original
id value1 value2
----------- ----------- -----------
1 NULL NULL
2 NULL NULL
SELECT * FROM #temp
id name value
----------- ---------- -----------
1 value1 10
1 value2 11
2 value1 20
2 value2 21
UPDATE O SET
value1 = CASE WHEN T.name = 'value1' THEN T.value ELSE value1 END,
value2 = CASE WHEN T.name = 'value2' THEN T.value ELSE value2 END
FROM
#original O
INNER JOIN #temp T ON T.id = O.id
SELECT * FROM #original
id value1 value2
----------- ----------- -----------
1 10 NULL
2 20 NULL
我不明白为什么两者value2
are NULL
.
SELECT
O.id,
CASE WHEN T.name = 'value1' THEN T.value ELSE value1 END AS value1,
CASE WHEN T.name = 'value2' THEN T.value ELSE value2 END AS value2
FROM
#original O
INNER JOIN #temp T ON T.id = O.id
id value1 value2
----------- ----------- -----------
1 10 NULL
1 NULL 11
2 20 NULL
2 NULL 21
运行上面的内容而不是更新,它看起来与我想象的完全一样,我认为这意味着“四个”更新,填充两者value1
and value2
在两行中。
如果有人能向我解释这一点,我将非常感激。