SQLで複数の列を更新する


166

挿入ステートメントが使用されるのと同じ方法でSQLサーバーの複数の列を更新する方法はありますか?

何かのようなもの:

Update table1 set (a,b,c,d,e,f,g,h,i,j,k)=
(t2.a,t2.b,t2.c,t2.d,t2.e,t2.f,t2.g,t2.h,t2.i,t2.j,t2.k)
from table2 t2
where table1.id=table2.id

または、そうではなく、そのようなもの:

update table set a=t2.a,b=t2.b etc 

100以上の列がある場合、これを書くのはかなり面倒です。


エラーが発生しやすいようです
AD7six 2012年

プログラムで行う場合は、パラメーター化されたクエリを使用します。一度記述するだけで済みます。手動で行う場合は、SQL Management Studioのエディターを使用して、クエリを作成するのではなく、データを行に直接入力します。
Dan Bechard

回答:


89

「面倒な方法」は標準SQLであり、主流のRDBMSがそれを行う方法です。

100個以上の列を使用すると、ほとんどの場合、設計上の問題が発生します...また、クライアントツール(たとえば、生成UPDATEステートメント)またはORMを使用して軽減する方法があります。


5
それで、MSSQLでそれを行う他の方法はありませんか?
Joe

4
@ジョー:いいえ。以下のアレックスKからの回答(stackoverflow.com/a/9079904/27535)を参照してください。MSに追加するよう要求があります
gbn

1keydata.com/sql/sqlupdate.htmlを使用すると思います "SET column_1 = [value1]、column_2 = [value2]"
DeLe

同意します。一般的な用語では設計の問題ですが、一括検証/データクリーニングが必要になる場合があります。私は現在そのようにしており、SQL Server 2012では、以下の@John Wooの回答ごとに複数の列を更新できます。
ヒラリー

201

これを試して:

UPDATE table1 
SET a = t2.a, b = t2.b, .......
FROM table2 t2
WHERE table1.id = t2.id

これは、Oracleを除くほとんどのSQL方言で機能します。

そしてはい-それは多くのタイピングです-それはSQLがこれをする方法です


4
:これは、Oracleでは動作しませんdocs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
ラファウ

16
こんにちは。あなたの言う通りですが、SQL方言では機能しないと述べたいだけです。
ラファウ

3
MySQLで動作します。
ジョアン・ファリアス


19

クエリはほぼ正しいです。このためのT-SQLは次のとおりです。

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID

問題は構文の正しさに関するものではないので、OPがエイリアスを大まかに使用しているのではないかと思いますが、この構文の「理由」です。個人的には、ここで行ったように、全体を通してエイリアスを使用することを好みます:stackoverflow.com/a/982947/27535
gbn

17

構文

UPDATE table-name 
SET column-name = value, column-name = value, ...
WHERE condition


UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6


4

私はこの方法で試しましたが、うまくいきました:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name

これは、PostgreSQL 12.2のインストール(DBeaverを使用してテスト済み)では問題なく動作するようです。
Telmo Trooper

1

これが機能するものです:

UPDATE  `table_1`
INNER JOIN 
 `table_2` SET  col1= value, col2= val,col3= val,col4= val;

値はtable_2の列です


1

これを数回再入力する必要がある場合は、私が一度行ったように行うことができます。列の名前をExcelシートの行に入れます(各列名の最後にメモします(=)これはメモ帳++で簡単です)列を作成して、新しいエントリに対応する値をコピーして貼り付けます各列。次に、それらの右側の独立した列に、設計どおりにコンマを入れます

次に、毎回中央の列に値をコピーしてから、貼り付けて実行する必要があります

簡単な解決策がわかりません


0

この種の質問にどのように対処するかを皆さんと共有したいと思います。table2の結果は動的であり、列番号はtable1の結果よりも少ない可能性があるため、私の場合は少し異なります。しかし、概念は同じです。

まず、table2の結果を取得します。

ここに画像の説明を入力してください

次に、アンピボットします。

ここに画像の説明を入力してください

次に、動的SQLを使用して更新クエリを記述します。サンプルコードは、2つの単純なテーブル-tblAとtblBをテストするために作成されています

--CREATE TABLE tblA(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--CREATE TABLE tblB(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--INSERT INTO tblA(id, col1, col2, col3, col4)
--VALUES(1,'A1','A2','A3','A4')
--INSERT INTO tblB(id, col1, col2, col3, col4)
--VALUES(1,'B1','B2','B3','B4')

DECLARE @id VARCHAR(10) = 1, @TSQL NVARCHAR(MAX)
DECLARE @tblPivot TABLE(    
    colName VARCHAR(255),
    val VARCHAR(255)
)

INSERT INTO @tblPivot
SELECT colName, val
FROM tblB
UNPIVOT
(
    val
    FOR colName IN (col1, col2, col3, col4)
) unpiv
WHERE id = @id

SELECT @TSQL = COALESCE(@TSQL + '''
,','') + colName + ' = ''' + val
FROM @tblPivot

SET @TSQL = N'UPDATE tblA
SET ' + @TSQL + ''' 
WHERE id = ' + @id
PRINT @TSQL
--EXEC SP_EXECUTESQL @TSQL

PRINT @TSQL 結果:

ここに画像の説明を入力してください


-3

私はこれをMySqlで行い、単一のレコードの複数の列を更新したので、MySqlをサーバーとして使用している場合は、これを試してください。

"UPDATE creditor_tb SET credit_amount='" & CDbl(cur_amount) & "'
                   , totalamount_to_pay='" & current_total & "',   
        WHERE credit_id='" & lbcreditId.Text & "'". 

ただし、MySqlサーバーを使用してvb.netでコーディングしていましたが、MySqlをサーバーとして使用している限り、お好きなプログラミング言語にそれを取り入れることができます。



-8
update T1
set T1.COST2=T1.TOT_COST+2.000,
T1.COST3=T1.TOT_COST+2.000,
T1.COST4=T1.TOT_COST+2.000,
T1.COST5=T1.TOT_COST+2.000,
T1.COST6=T1.TOT_COST+2.000,
T1.COST7=T1.TOT_COST+2.000,
T1.COST8=T1.TOT_COST+2.000,
T1.COST9=T1.TOT_COST+2.000,
T1.COST10=T1.TOT_COST+2.000,
T1.COST11=T1.TOT_COST+2.000,
T1.COST12=T1.TOT_COST+2.000,
T1.COST13=T1.TOT_COST+2.000
from DBRMAST T1 
inner join DBRMAST t2 on t2.CODE=T1.CODE

2
それが何をしているのかを説明するために、回答にコメントを追加してください。現時点では、これは低品質の回答としてフラグが立てられており、改善されない限り削除されます。
Ian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.