1089

と のデータベースが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

4

27 に答える 27

1562

UPDATE FROM私は助けになると信じていJOINます:

MSSQL

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;
于 2008-10-22T07:19:54.610 に答える
320

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

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

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

于 2010-01-20T12:26:50.277 に答える
162

SQL Server 2008 +MERGE専用の構文ではなく使用することには、UPDATE ... FROMいくつかの魅力があります。

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

于 2012-02-11T15:13:15.727 に答える
132

将来の開発者向けの一般的な回答。

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;
于 2016-08-29T17:59:14.940 に答える
55

PostgreSQL の場合:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 
于 2014-07-16T19:55:13.500 に答える
39

MSSQL を使用しているようですが、私の記憶が正しければ、次のように実行されます。

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
于 2008-10-22T07:21:53.467 に答える
36

に一致するキーがない行にfoo.new設定されている場合にも同じ問題が発生しました。私はOracleで次のようなことをしました。nullfoobar

fooを更新します
set foo.new =(select bar.new
                  バーから
                  ここで、foo.key = bar.key)
存在する場所(1を選択
              バーから
              ここで、foo.key = bar.key)
于 2009-04-29T18:32:22.233 に答える
29

正常に動作するMySqlの場合:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID
于 2012-02-13T16:40:03.477 に答える
22

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

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)  
于 2008-10-22T08:07:41.083 に答える
20

テーブルが別のデータベースにある場合。(MSSQL)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
于 2019-04-24T04:14:53.453 に答える
8

IDが一致したときに、あるテーブルから別のテーブルに更新します

UPDATE 
     TABLE1 t1, 
     TABLE2 t2
SET 
     t1.column_name = t2.column_name 
WHERE
     t1.id = t2.id;
于 2020-12-21T13:25:30.673 に答える
7

誰かが提案した以下の SQL は、SQL Server では機能しません。この構文は、私の古い学校のクラスを思い出させます。

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

NOT INorを使用する他のすべてのクエリNOT EXISTSは推奨されません。OPはデータセット全体を小さなサブセットと比較するため、NULLが表示されます。もちろん、マッチングの問題が発生します。JOINこれは、 を使用して問題を回避するのではなく、正しい SQL を正しく記述して修正する必要がありますNOT INNOT INこの場合、 orを使用すると、他の問題が発生する可能性がありますNOT EXISTS

SQL Server に参加して、別のテーブルに基づいてテーブルを更新する従来の方法である一番上のものに投票します。UPDATE先ほど言ったように、最初に結合しない限り、SQL Serverの同じステートメントで 2 つのテーブルを使用することはできません。

于 2016-06-12T20:54:06.687 に答える
4

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

  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
于 2012-12-06T12:24:29.870 に答える
4

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
);
于 2015-05-14T09:30:28.590 に答える
2

これは簡単な例だと思いましたが、誰かが簡単に理解できるかもしれません。

        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
于 2012-06-04T11:55:41.443 に答える
0

これにより、別のテーブルで見つからない列の値に基づいてテーブルを更新できます。

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
            SELECT * 
            FROM (
                    SELECT table1.id
                    FROM  table1 
                    LEFT JOIN table2 ON ( table2.column = table1.column ) 
                    WHERE table1.column = 'some_expected_val'
                    AND table12.column IS NULL
            ) AS Xalias
    )

これにより、両方のテーブルで見つかった列の値に基づいてテーブルが更新されます。

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
            SELECT * 
            FROM (
                    SELECT table1.id
                    FROM  table1 
                    JOIN table2 ON ( table2.column = table1.column ) 
                    WHERE table1.column = 'some_expected_val'
            ) AS Xalias
    )
于 2015-04-02T15:27:50.667 に答える
0

オラクル

使用する

UPDATE suppliers
SET supplier_name = (SELECT customers.customer_name
                     FROM customers
                     WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.customer_name
              FROM customers
              WHERE customers.customer_id = suppliers.supplier_id);

于 2022-01-28T15:14:07.920 に答える