account numbers
とcard numbers
を含むデータベースがあります。私はこれらをカードと照合して任意のカード番号をアカウント番号とupdate
するために照合します。それで私はアカウント番号だけを使って作業しています。
Table ID
と関連する口座番号を返すためにテーブルを口座/カードデータベースにリンクするビューを作成しました。次に、IDが口座番号と一致するレコードを更新する必要があります。
これはSales_Import
テーブルで、account number
フィールドを更新する必要があります。
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
そしてこれはRetrieveAccountNumber
テーブルです。ここから更新する必要があります。
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
私は以下を試したが、これまでのところ運が悪い。
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
カード番号を口座番号に更新しますが、口座番号はNULL
に置き換えられます。
私はJOIN
を伴うUPDATE FROM
が役立つと信じています
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID;
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
あるテーブルから別のテーブルにコンテンツをコピーする簡単な方法は次のとおりです。
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
特定のデータをコピーするための条件を追加することもできます。
SQL Server 2008の場合+独自のUPDATE ... FROM
構文ではなくMERGE
を使用することには魅力があります。
標準SQLであるため移植性が高いだけでなく、ソース側に複数の結合行がある場合(したがって更新に使用する複数の異なる値がある場合)にもエラーが発生します。 。
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
残念ながら、どちらを使用するかの選択は、純粋に好みのスタイルには及ばないかもしれません。 SQL ServerでのMERGE
の実装にはさまざまなバグがあります。 Aaron Bertrandは ここで報告されたもの のリストをまとめました。
将来の開発者のための一般的な答え。
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
UPDATE
t1
SET
t1.colmun = t2.column
FROM
Table1 t1,
Table2 t2
WHERE
t1.ID = t2.ID;
UPDATE
Table1 t1,
Table2 t2
SET
t1.column = t2.column
WHERE
t1.ID = t2.ID;
あなたはMSSQLを使っているようです、それから私が正しく覚えていれば、それはこのようにされます:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
null
に一致するキーがないfoo
の行に対してfoo.new
をbar
に設定した場合も同じ問題がありました。私はOracleでこのようなことをしました:
foo を更新します。 (foo.key = bar.keyの場合、bar から1 を選択してください)
PostgreSQLの場合:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
MySqlの場合は正常に動作します。
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
回答いただきありがとうございます。私はあなたに解決策を見つけました。
UPDATE Sales_Import
SET AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE Sales_Import.leadid =RetrieveAccountNumber.LeadID)
WHERE Sales_Import.leadid = (SELECT RetrieveAccountNumber.LeadID
FROM RetrieveAccountNumber
WHERE Sales_Import.leadid = RetrieveAccountNumber.LeadID)
これが私にとってSQL Serverでうまくいったことです:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
次のクエリブロックを使用して、IDに基づいてTable1をTable2に更新します。
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
これがこの問題に取り組むための 最も簡単な方法 です。
下記のSQLの誰かが提案した、SQL Serverでは動作しません。この構文は私に私の古い学校の授業を思い出させます:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
NOT IN
またはNOT EXISTS
を使用する他のすべてのクエリはお勧めできません。 OPはデータセット全体をより小さいサブセットと比較するため、NULLが表示されます。もちろん、マッチングの問題が発生します。 NOT IN
を使用して問題を回避するのではなく、正しいJOIN
を使用して適切なSQLを記述することでこれを修正する必要があります。この場合、NOT IN
またはNOT EXISTS
を使用すると、他の問題に遭遇する可能性があります。
一番上のものに私の投票、それはSQL Serverに参加することによって別のテーブルに基づいてテーブルを更新する従来の方法です。私が言ったように、最初に結合しない限り、SQL Serverの同じUPDATE
ステートメントで2つのテーブルを使用することはできません。
同じテーブル内で更新します。
DECLARE @TB1 TABLE
(
No Int
,Name NVarchar(50)
,linkNo int
)
DECLARE @TB2 TABLE
(
No Int
,Name NVarchar(50)
,linkNo int
)
INSERT INTO @TB1 VALUES(1,'changed person data', 0);
INSERT INTO @TB1 VALUES(2,'old linked data of person', 1);
INSERT INTO @TB2 SELECT * FROM @TB1 WHERE linkNo = 0
SELECT * FROM @TB1
SELECT * FROM @TB2
UPDATE @TB1
SET Name = T2.Name
FROM @TB1 T1
INNER JOIN @TB2 T2 ON T2.No = T1.linkNo
SELECT * FROM @TB1
それはpostgresqlで動作します
UPDATE application
SET omts_received_date = (
SELECT
date_created
FROM
application_history
WHERE
application.id = application_history.application_id
AND application_history.application_status_id = 8
);
MS SQL
UPDATE c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE c4..Name='MyName';
Oracle 11g
MERGE INTO TableNamea_A u
using
(
SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot
FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE p.Name='MyName'
) rt
on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
WHEN MATCHED THEN
Update set Price=CalcTot ;
これは簡単な例だと思いました。
DECLARE @TB1 TABLE
(
No Int
,Name NVarchar(50)
)
DECLARE @TB2 TABLE
(
No Int
,Name NVarchar(50)
)
INSERT INTO @TB1 VALUES(1,'asdf');
INSERT INTO @TB1 VALUES(2,'awerq');
INSERT INTO @TB2 VALUES(1,';oiup');
INSERT INTO @TB2 VALUES(2,'lkjhj');
SELECT * FROM @TB1
UPDATE @TB1 SET Name =S.Name
FROM @TB1 T
INNER JOIN @TB2 S
ON S.No = T.No
SELECT * FROM @TB1
テーブルが異なるデータベースにある場合。 (SQLサーバー)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;