web-dev-qa-db-ja.com

IDの一致に基づいて、あるテーブルから別のテーブルへのSQL更新

account numberscard 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に置き換えられます。

803
Boerseun

私はJOINを伴うUPDATE FROMが役立つと信じています

MS SQL

UPDATE
    Sales_Import
SET
    Sales_Import.AccountNumber = RAN.AccountNumber
FROM
    Sales_Import SI
INNER JOIN
    RetrieveAccountNumber RAN
ON 
    SI.LeadID = RAN.LeadID;

MySQLとMariaDB

UPDATE
    Sales_Import SI,
    RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID;
1204

あるテーブルから別のテーブルにコンテンツをコピーする簡単な方法は次のとおりです。

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

特定のデータをコピーするための条件を追加することもできます。

269
Shivkant

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は ここで報告されたもの のリストをまとめました。

150
Martin Smith

将来の開発者のための一般的な答え。 

SQLサーバー

UPDATE 
     t1
SET 
     t1.column = t2.column
FROM 
     Table1 t1 
     INNER JOIN Table2 t2 
     ON t1.id = t2.id;

Oracle(およびSQL Server)

UPDATE 
     t1
SET 
     t1.colmun = t2.column 
FROM 
     Table1 t1, 
     Table2 t2 
WHERE 
     t1.ID = t2.ID;

MySQL

UPDATE 
     Table1 t1, 
     Table2 t2
SET 
     t1.column = t2.column 
WHERE
     t1.ID = t2.ID;
60
Tigerjz32

あなたはMSSQLを使っているようです、それから私が正しく覚えていれば、それはこのようにされます:

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
33
Vinko Vrsalovic

nullに一致するキーがないfooの行に対してfoo.newbarに設定した場合も同じ問題がありました。私はOracleでこのようなことをしました:

 foo 
を更新します。 (foo.key = bar.keyの場合、bar 
から1 
を選択してください)
29

PostgreSQLの場合:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 
27
petter

MySqlの場合は正常に動作します。

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID
26
marsanvi

回答いただきありがとうございます。私はあなたに解決策を見つけました。

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)  
14
Boerseun

これが私にとってSQL Serverでうまくいったことです:

UPDATE [AspNetUsers] SET

[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
11
Abhimanyu

次のクエリブロックを使用して、IDに基づいてTable1をTable2に更新します。

UPDATE Sales_Import, RetrieveAccountNumber 
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;

これがこの問題に取り組むための 最も簡単な方法 です。

3
Gil Baggio

下記の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つのテーブルを使用することはできません。

3
Dr Inner Join

同じテーブル内で更新します。

  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
3
NCP

それは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
);
2
jakentus

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  ;
1
saman samadi

これは簡単な例だと思いました。 

        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
1
user824910

テーブルが異なるデータベースにある場合。 (SQLサーバー)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
0
Maurico Bello

Oracle 11g

merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
0
Bruno