[英]How to Update record values with values from an existing record in same table
使用 SQL Server 2012:
我需要在這里做類似的事情,但我需要按如下方式更改值:
mytable 中每個 M_id 有 2 條記錄,由 MAS 區分。 在 MAS=1 記錄上的任何值(1-80)字段中出現“1”值時,我需要更新記錄 MAS=2 中的值以匹配:
前:
id | M_id | MAS | value1 | value2 | value3.....up to value80
---|-------|-----|--------|--------|-------|
1 | 100 | 1 | 0 | 1 | 0
2 | 100 | 2 | 0 | 0 | 0
后:
id | M_id | MAS | value1 | value2 | value3.....up to value80
---|-------|-----|--------|--------|-------|
1 | 100 | 1 | 0 | 1 | 0
2 | 100 | 2 | 0 | 1 | 0
我需要對列表中包含 M_id 的 3000 多條記錄執行此操作。
這對我來說有點復雜,有人知道該怎么做嗎?
非常感謝,
議員
這應該這樣做:
update mytable_mas2
set value1 = mytable_mas1.value1,
value2 = mytable_mas1.value2,...
from mytable mytable_mas2
join mytable mytable_mas1
on mytable_mas2.m_id = mytable_mas1.m_id
where mytable_mas2.mas = 2
and mytable_mas1.mas= 1
and mytable_mas1.m_id in (200,201, ...)
如果您只想影響特定的 m_id,請在(id 列表)中添加和 m1.m_id。
如果您有 80 列,則使用動態 SQL 而不是編寫整個更新查詢會更容易。
DECLARE @strQuery Varchar(MAX)
SET @strQuery = 'UPDATE T1 SET '
SELECT @strQuery = @strQuery + 'T1.' + COLUMN_NAME + ' = T2.' + COLUMN_NAME + ' ,'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME Like 'Value%'
SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM MyTable T1 INNER JOIN MyTable T2
ON T1.m_id = T2.m_id
WHERE T1.mas = 2
AND T2.mas= 1
AND T1.m_id IN(100,200,300,400,500) '
-- IN Clause added after on the OP demand
--If you want to show up your Query
SELECT(@strQuery)
-- To execute it
EXEC(@strQuery)
注意:我這只會更新 m_id = 100 或 200 或 300 或 400 或 500 的記錄
如果您在編寫整個查詢時沒有問題,@MikeS 答案對您很有效。
您遇到了設計錯誤:列的“數組”。 現在您想搜索該數組,但沒有找到好的方法,因為您沒有按預期使用 SQL。
編號列幾乎總是將數據保存在元數據中的示例。 如果我們將這些數據移回表中,SQL 就變得簡單了。
假設您有一個value
列和一個ordinal
列來說明它是哪一個:
create table T( id int, M_id int, MAS int,
ordinal int not NULL check (ordinal between 1 and 80),
value int );
update T
set value = (
select value from T as T2
where T.id = T2.id and T.M_id = T2.M_id and T.ordinal = T2.ordinal
and MAS = 1
)
where MAS = 2
and exists (
select 1 from T as T2
where T.id = T2.id and T.M_id = T2.M_id and T.ordinal = T2.ordinal
and MAS = 1
)
這是一個單一的更新語句。 它使用 ANSI 標准語法來避免update from
構造的專有 T-SQL update from
可能導致的異常。
除其他優點外,您不再需要存儲零。 您可以將缺失值(不存在的行)視為隱含的零。 那會讓你的更新變得更復雜一些; 幸好 SQL Server 支持merge
。
如果您想以您設計的方式查看您的表格,您不會是第一個。 編寫一個視圖來呈現它; 它通常被稱為table-folding 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.