我有 2 個表 A 和 B。
A就像
| 一項政策 | 價值第一類 | 價值第二類 | 價值第三類 | .... |
|---|---|---|---|---|
| 10 | 15000 | 2000年 | 75000 | ... |
| 11 | 12500 | 2500 | 7000 | ... |
| 12 | ... | ... | ... | ... |
| ... | ... | ... | ... | ... |
欄位Value Category X中的金額不正確。由于表 B,我想更新這些金額,就像
| B_政策 | 類別 | 價值 | ... | .... |
|---|---|---|---|---|
| 10 | 1 | 11000 | ... | ... |
| 10 | 2 | 1500 | ... | ... |
| 10 | 3 | 8500 | ... | ... |
| 11 | 1 | 12500 | ... | ... |
| ... | ... | ... | ... | ... |
你知道如何進行嗎?這里的困難來自這樣一個事實,即表 A 中的值有 3 個欄位,而表 B 中的值只有 1 個欄位。
uj5u.com熱心網友回復:
那么你可以嘗試這樣的事情。
DECLARE @table_a AS TABLE ( A_Policy INT, First INT, Second INT, Third INT )
DECLARE @table_b AS TABLE ( B_Policy INT, Cat INT, Value INT )
INSERT INTO @table_a ( A_Policy, First, Second, Third )
VALUES ( 10, 15000, 2000, 75000 )
, ( 11, 12500, 2500, 7000 )
INSERT INTO @table_b ( B_Policy, Cat, Value )
VALUES ( 10, 1, 11000 )
, ( 10, 2, 150 )
, ( 10, 3, 8500 )
, ( 11, 1, 12500 )
SELECT *
FROM @table_a
UPDATE a
SET First = Value
FROM @table_a a
JOIN @table_b b ON a.A_Policy = b.B_Policy
AND b.Cat = 1
UPDATE a
SET Second = Value
FROM @table_a a
JOIN @table_b b ON a.A_Policy = b.B_Policy
AND b.Cat = 2
UPDATE a
SET Third = Value
FROM @table_a a
JOIN @table_b b ON a.A_Policy = b.B_Policy
AND b.Cat = 3
SELECT *
FROM @table_a
不是最優雅的方法,但如果只有三個更新,在現實世界中這是一個快速且可行的解決方案。可擴展性取決于您有多少行。
uj5u.com熱心網友回復:
您可以JOIN多次使用源表將其“旋轉”為您需要的形式:
SELECT DISTINCT t0.B_Policy
, t1.Value as Value_Category_1
, t2.Value as Value_Category_2
, t3.Value as Value_Category_3
FROM tab_b t0
LEFT JOIN tab_b t1 ON t0.B_Policy = t1.B_Policy AND t1.category = 1
LEFT JOIN tab_b t2 ON t0.B_Policy = t2.B_Policy AND t2.category = 2
LEFT JOIN tab_b t3 ON t0.B_Policy = t3.B_Policy AND t3.category = 3
;
然后您可以將MERGE其用于您的目標表。
在一份宣告中
WITH b_pivot AS
( SELECT DISTINCT t0.B_Policy, t1.Value as Value_Category_1, t2.Value as Value_Category_2, t3.Value as Value_Category_3
FROM tab_b t0
LEFT JOIN tab_b t1 ON t0.B_Policy = t1.B_Policy AND t1.category = 1
LEFT JOIN tab_b t2 ON t0.B_Policy = t2.B_Policy AND t2.category = 2
LEFT JOIN tab_b t3 ON t0.B_Policy = t3.B_Policy AND t3.category = 3
)
MERGE tab_a
USING b_pivot
ON tab_a.A_Policy = b_pivot.B_Policy
WHEN MATCHED
THEN UPDATE SET tab_a.Value_Category_1 = COALESCE(b_pivot.Value_Category_1, tab_a.Value_Category_1),
tab_a.Value_Category_2 = COALESCE(b_pivot.Value_Category_2, tab_a.Value_Category_2),
tab_a.Value_Category_3 = COALESCE(b_pivot.Value_Category_3, tab_a.Value_Category_3)
;
結果:
| 一項政策 | 值_類別_1 | Value_Category_2 | Value_Category_3 |
|---|---|---|---|
| 10 | 11000 | 1500 | 8500 |
| 11 | 13000 | 2500 | 7000 |
見db<>fiddle。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322820.html
標籤:sql sql-server sql更新
上一篇:對行求和以生成表中的列
