我有以下查詢將列組合成一個以逗號分隔的串列(使用它是因為STRING_AGG對我不起作用可能是由于我無法控制的舊版本的 SQL Server):
SELECT TOP 1
STUFF((SELECT ',' t1.HAZARD_code_desc
FROM HAZARD_codes t1
WHERE mask & 67584 <> 0
FOR XML PATH('')), 1, LEN(','), '')
FROM
HAZARD_codes t0, sheldus51_copy sc
WHERE
t0.mask & 67584 <> 0
然后使用以下查詢來更新另一個表中列的值:
UPDATE sheldus51_copy
SET hazard_type_combo = (SELECT TOP 1
STUFF((SELECT ',' t1.HAZARD_code_desc
FROM HAZARD_codes t1
WHERE mask & sc.mask <> 0
FOR XML PATH('')), 1, LEN(','), '')
FROM HAZARD_codes t0, sheldus51_copy sc
WHERE t0.mask & sc.mask <> 0)
但是,該列中所有行的值hazard_type_combo都將更新為相同的值,而不是受該sc.mask值控制。IE
UPDATE table
SET column = (result of an expression)
這會將所有行更新為相同的值。我在這里錯過了什么?
下面的一些資料:
詢問:
select distinct(mask)
from sheldus51_copy
資料:
196608
131072
32
65536
131104
2048
64
256
1
4
1024
128
16
32768
67584
2
4096
512
8
詢問:
select HAZARD_code_desc, mask
from hazard_codes
結果:
Avalanche 1
Coastal 2
Drought 4
Earthquake 8
Flooding 16
Fog 32
Hail 64
Heat 128
Hurricane/Tropical Storm 256
Landslide 512
Lightning 1024
Severe Storm/Thunder Storm 2048
Tornado 4096
Tsunami/Seiche 8192
Volcano 16384
Wildfire 32768
Wind 65536
Winter Weather 131072
示例查詢
select HAZARD_code_desc, mask
from hazard_codes
where mask & 67584 <> 0
將匹配其中掩模為2048和65536中的行,因此應為設定的值hazard_type_combo以Severe Storm/Thunder Storm, Wind
uj5u.com熱心網友回復:
您需要在頂層的 FROM 子句中參考 sheldus51_copy 表并為其設定別名,以便 UPDATE 和嵌套選擇(相關子查詢)可以參考相同的行。嘗試:
UPDATE sc
SET hazard_type_combo = STUFF((
SELECT ',' h.HAZARD_code_desc
FROM HAZARD_codes h
WHERE h.mask & sc.mask <> 0
-- ORDER BY ...
FOR XML PATH('')
), 1, LEN(','), '')
FROM sheldus51_copy sc
如果您想要可預測的結果,還建議添加 ORDER BY h.HAZARD_code_desc 或 ORDER BY h.mask。
如果 sc.mask 可以為零(無代碼),您可以在運算式周圍添加 ISNULL() 以分配默認值,例如“無”或空字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404957.html
標籤:
下一篇:如何按間隔建立成功率?
