SQL Server では、insert
name__ステートメントを使用してSELECT
name__をテーブルにすることができます。
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
SELECT
name__を介して update にすることも可能ですか?値を含む一時テーブルがあり、それらの値を使用して別のテーブルを更新したいと思います。おそらくこのようなものです:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
UPDATE
Table_A
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
FROM
Some_Table AS Table_A
INNER JOIN Other_Table AS Table_B
ON Table_A.id = Table_B.id
WHERE
Table_A.col3 = 'cool'
SQL Server 2008(またはそれ以降)では、 MERGE
を使用します。
MERGE INTO YourTable T
USING other_table S
ON T.id = S.id
AND S.tsql = 'cool'
WHEN MATCHED THEN
UPDATE
SET col1 = S.col1,
col2 = S.col2;
あるいは
MERGE INTO YourTable T
USING (
SELECT id, col1, col2
FROM other_table
WHERE tsql = 'cool'
) S
ON T.id = S.id
WHEN MATCHED THEN
UPDATE
SET col1 = S.col1,
col2 = S.col2;
UPDATE table
SET Col1 = i.Col1,
Col2 = i.Col2
FROM (
SELECT ID, Col1, Col2
FROM other_table) i
WHERE
i.ID = table.ID
Robinの素晴らしい答え 以下を修正します。
UPDATE Table
SET Table.col1 = other_table.col1,
Table.col2 = other_table.col2
FROM
Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
other_table.col1 IS NOT NULL
AND Table.col1 IS NULL
)
OR (
other_table.col2 IS NOT NULL
AND Table.col2 IS NULL
)
WHERE句がないと、影響を受ける必要がない行にも影響を与えます。これにより、(おそらく)インデックスの再計算や、実際には起動されるべきではないトリガーが起動される可能性があります。
一方通行
UPDATE t
SET t.col1 = o.col1,
t.col2 = o.col2
FROM
other_table o
JOIN
t ON t.id = o.id
WHERE
o.sql = 'cool'
まだ言及されていないもう1つの可能性は、SELECT
ステートメント自体をCTEにチャックしてからCTEを更新することです。
;WITH CTE
AS (SELECT T1.Col1,
T2.Col1 AS _Col1,
T1.Col2,
T2.Col2 AS _Col2
FROM T1
JOIN T2
ON T1.id = T2.id
/*Where clause added to exclude rows that are the same in both tables
Handles NULL values correctly*/
WHERE EXISTS(SELECT T1.Col1,
T1.Col2
EXCEPT
SELECT T2.Col1,
T2.Col2))
UPDATE CTE
SET Col1 = _Col1,
Col2 = _Col2
これは、最初にSELECT
ステートメントを実行して結果を健全性チェックするのが簡単であるという利点がありますが、ソース表とターゲット表で同じ名前の場合は上記のように列を別名設定する必要があります。
これには、他の4つの答えに示されている独自のUPDATE ... FROM
構文と同じ制限があります。ソーステーブルが1対多結合の多面的な側にある場合、一致する可能性のある結合レコードのどれがUpdate
で使用されるのかが不確定です(MERGE
は、同じ行を複数回更新しようとするとエラーになります。
レコード(および私がそうだったように検索している他の人)については、MySQLでこれを行うことができます。
UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
エイリアスを使う:
UPDATE t
SET t.col1 = o.col1
FROM table1 AS t
INNER JOIN
table2 AS o
ON t.id = o.id
簡単な方法は次のとおりです。
UPDATE
table_to_update,
table_info
SET
table_to_update.col1 = table_info.col1,
table_to_update.col2 = table_info.col2
WHERE
table_to_update.ID = table_info.ID
これは、更新を実行するためのニッチな理由(たとえば、主にプロシージャで使用される場合)、または他の人には明らかな場合がありますが、結合を使用せずにupdate-selectステートメントを実行できることも述べてください。更新中のテーブルには共通のフィールドがありません。
update
Table
set
Table.example = a.value
from
TableExample a
where
Table.field = *key value* -- finds the row in Table
AND a.field = *key value* -- finds the row in TableExample a
これは別の便利な構文です:
UPDATE suppliers
SET supplier_name = (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id);
「WHERE EXIST」を使用して、nullかどうかを確認します。
SQL Serverの代わりに MySQL を使用する場合、構文は次のとおりです。
UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
私はこれを追加するだけですので、あなたがそれを書くための素早い方法を見ることができるようにあなたはあなたが更新をする前に何が更新されるかをチェックすることができます。
UPDATE Table
SET Table.col1 = other_table.col1,
Table.col2 = other_table.col2
--select Table.col1, other_table.col,Table.col2,other_table.col2, *
FROM Table
INNER JOIN other_table
ON Table.id = other_table.id
SQLデータベース内のINNER JOINを使用したSELECTからの更新
この投稿への返信が多すぎて、最も賛成が得られているので、ここでも私の提案をしたいと思いました。質問は非常に興味深いものですが、私は多くのフォーラムサイトで見たことがあり、スクリーンショットで INNER JOIN を使用して解決策を作成しました。
最初に、 schoolold という名前のテーブルを作成し、それらの列名に関していくつかのレコードを挿入して実行しました。
それから _ select _ コマンドを実行して、挿入されたレコードを表示します。
それから私は schoolnew という名前の新しいテーブルを作成し、それに対して上記のアクションを同様に実行しました。
それから、そこに挿入されたレコードを見るために、私はSELECTコマンドを実行します。
では、ここで3行目と4行目でいくつか変更を加えたいと思います。このアクションを完了するには、 INNER JOIN を指定して _ update _ commandを実行します。
変更を確認するには、 _ select _ コマンドを実行します。
UPDATEステートメントでINNER JOINを使用すると、テーブル schoolold の3番目と4番目のレコードがテーブル schoolnew に簡単に置き換えられることがわかります。
そして、もしあなたが自分自身でテーブルに参加したいのであれば(あまり頻繁には起こらないでしょう):
update t1 -- just reference table alias here
set t1.somevalue = t2.somevalue
from table1 t1 -- these rows will be the targets
inner join table1 t2 -- these rows will be used as source
on .................. -- the join clause is whatever suits you
次の例では、派生テーブル、FROM句の後のSELECTステートメントを使用して、さらに更新するために新旧の値を返します。
UPDATE x
SET x.col1 = x.newCol1,
x.col2 = x.newCol2
FROM (SELECT t.col1,
t2.col1 AS newCol1,
t.col2,
t2.col2 AS newCol2
FROM [table] t
JOIN other_table t2
ON t.ID = t2.ID) x
CTE
による更新は、他の答えよりも読みやすくなっています。
;WITH cte
AS (SELECT col1,col2,id
FROM other_table
WHERE sql = 'cool')
UPDATE A
SET A.col1 = B.col1,
A.col2 = B.col2
FROM table A
INNER JOIN cte B
ON A.id = B.id
SQL Serverを使用している場合は、結合を指定せずに1つのテーブルを別のテーブルから更新し、単に2つをwhere
句からリンクすることができます。これにより、SQLクエリがずっと簡単になります。
UPDATE Table1
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
FROM
Table2
WHERE
Table1.id = Table2.id
UPDATE TQ
SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0
あなたが欲しいものを更新していることを確認するために、最初に選択
SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0
他の方法は、派生テーブルを使用することです。
UPDATE t
SET t.col1 = a.col1
,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id
サンプルデータ
DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'
INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'
UPDATE t
SET t.col1 = a.col1
,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id
SELECT * FROM @tbl1
SELECT * FROM @tbl2
より短い方法さえあります そしてそれはあなたにとって驚くべきかもしれません:
サンプルデータセット:
CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
CREATE TABLE #DEST ([ID] INT, [Desc] VARCHAR(10));
INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
INSERT INTO #DEST VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
コード:
UPDATE #DEST
SET #DEST.[Desc] = #SOURCE.[Desc]
FROM #SOURCE
WHERE #DEST.[ID] = #SOURCE.[ID];
つかいます:
drop table uno
drop table dos
create table uno
(
uid int,
col1 char(1),
col2 char(2)
)
create table dos
(
did int,
col1 char(1),
col2 char(2),
[sql] char(4)
)
insert into uno(uid) values (1)
insert into uno(uid) values (2)
insert into dos values (1,'a','b',null)
insert into dos values (2,'c','d','cool')
select * from uno
select * from dos
EITHER:
update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'),
col2 = (select col2 from dos where uid = did and [sql]='cool')
または:
update uno set col1=d.col1,col2=d.col2 from uno
inner join dos d on uid=did where [sql]='cool'
select * from uno
select * from dos
ID列名が両方のテーブルで同じ場合は、更新するテーブルの前にテーブル名を配置して、選択したテーブルのエイリアスを使用します。
update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'),
col2 = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
以下の解決策はMySQLデータベースに有効です。
UPDATE table1 a , table2 b
SET a.columname = 'some value'
WHERE b.columnname IS NULL ;
SELECTステートメントから更新するもう1つの方法
UPDATE A
SET A.col = A.col,B.col1 = B.col1
FROM first_Table AS A
INNER JOIN second_Table AS B ON A.id = B.id WHERE A.col2 = 'cool'
承認された回答では、
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
私は追加します:
OUTPUT deleted.*, inserted.*
私が普段していることは、すべてをロールバックトランザクションに入れて"OUTPUT"
:を使用することです。このようにして、起こりそうなことすべてを確認します。私が見たものに満足したら、ROLLBACK
をCOMMIT
に変更します。
私は通常自分がしたことを文書化する必要があるので、ロールバッククエリを実行するときに"results to Text"
オプションを使用し、スクリプトとOUTPUTの結果の両方を保存します。 (もちろん、あまりにも多くの行を変更した場合、これは実用的ではありません)
UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...
ここにすべての異なるアプローチをまとめます。
サンプルテーブル構造は以下のとおりで、Product_BAKからProductテーブルに更新されます。
CREATE TABLE [dbo].[Product](
[Id] [int] IDENTITY(1, 1) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[Description] [nvarchar](100) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Product_BAK](
[Id] [int] IDENTITY(1, 1) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[Description] [nvarchar](100) NULL
) ON [PRIMARY]
update P1
set Name = P2.Name
from Product P1
inner join Product_Bak P2 on p1.id = P2.id
where p1.id = 2
; With CTE as
(
select id, name from Product_Bak where id = 2
)
update P
set Name = P2.name
from product P inner join CTE P2 on P.id = P2.id
where P2.id = 2
Merge into product P1
using Product_Bak P2 on P1.id = P2.id
when matched then
update set p1.[description] = p2.[description], p1.name = P2.Name;
Mergeステートメントでは、ターゲットで一致するレコードが見つからない場合でもインセットを実行できますが、ソースには存在するので構文を見つけてください。
Merge into product P1
using Product_Bak P2 on P1.id = P2.id;
when matched then
update set p1.[description] = p2.[description], p1.name = P2.Name;
WHEN NOT MATCHED THEN
insert (name, description)
values(p2.name, P2.description);
オプション1:内部結合の使用:
UPDATE
A
SET
A.col1 = B.col1,
A.col2 = B.col2
FROM
Some_Table AS A
INNER JOIN Other_Table AS B
ON A.id = B.id
WHERE
A.col3 = 'cool'
オプション2:相関サブクエリ
UPDATE table
SET Col1 = B.Col1,
Col2 = B.Col2
FROM (
SELECT ID, Col1, Col2
FROM other_table) B
WHERE
B.ID = table.ID
UPDATE table1
SET column1 = (SELECT expression1
FROM table2
WHERE conditions)
[WHERE conditions];
SQL Serverで、あるテーブルを別のテーブルのデータで更新するときのUPDATEステートメントの構文
SQL Serverでのアップデートにはこちらから使用できます
UPDATE
T1
SET
T1.col1 = T2.col1,
T1.col2 = T2.col2
FROM
Table1 AS T1
INNER JOIN Table2 AS T2
ON T1.id = T2.id
WHERE
T1.col3 = 'cool'
declare @tblStudent table (id int,name varchar(300))
declare @tblMarks table (std_id int,std_name varchar(300),subject varchar(50),marks int)
insert into @tblStudent Values (1,'Abdul')
insert into @tblStudent Values(2,'Rahim')
insert into @tblMarks Values(1,'','Math',50)
insert into @tblMarks Values(1,'','History',40)
insert into @tblMarks Values(2,'','Math',30)
insert into @tblMarks Values(2,'','history',80)
select * from @tblMarks
update m
set m.std_name=s.name
from @tblMarks as m
left join @tblStudent as s on s.id=m.std_id
select * from @tblMarks
同じ解決方法は、両方のテーブルについて書いた後で列を設定したいのとは少し異なる方法で書くことができます。 MySQLでの作業。
UPDATE Table t,
(SELECT col1, col2 FROM other_table WHERE sql = 'cool' ) o
SET t.col1 = o.col1, t.col2=o.col2
WHERE t.id = o.id
このような;ただし、更新テーブルと更新後のテーブルが同じであることを確認してください。
UPDATE Table SET col1, col2
FROM table
inner join other_table Table.id = other_table.id
WHERE sql = 'cool'