簡體   English   中英

如何使用同一表中現有記錄的值更新記錄值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM