복붙노트

[SQL] ID 일치를 기반으로 한 테이블에서 다른 SQL 업데이트

SQL

ID 일치를 기반으로 한 테이블에서 다른 SQL 업데이트

나는 계좌 번호와 카드 번호 데이터베이스를 가지고있다. 나는 단지 계좌 번호와 함께 일하고 그래서, 계좌 번호에 어떤 카드 번호를 업데이트 할 파일이 일치합니다.

나는 테이블 ID 및 관련 계좌 번호를 반환하는 계정 / 카드 데이터베이스에 테이블을 연결하는 뷰를 생성하고, 지금은 그 기록을 갱신 할 필요가 어디 계좌 번호와 ID가 일치.

이 계정 번호 필드를 업데이트 할 필요가 Sales_Import 테이블입니다 :

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로 대체됩니다

해결법

  1. ==============================

    1.나는와에서 업데이트는 의지의 도움을 가입 믿는다

    나는와에서 업데이트는 의지의 도움을 가입 믿는다

    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;
    
  2. ==============================

    2.다른 하나 개의 테이블에서 콘텐츠를 복사 할 수있는 간단한 방법은 다음과 같다 :

    다른 하나 개의 테이블에서 콘텐츠를 복사 할 수있는 간단한 방법은 다음과 같다 :

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

    또한 복사 된 특정 데이터를 얻을 수있는 조건을 추가 할 수 있습니다.

  3. ==============================

    3.구문은 어떤 매력을 가지고 FROM SQL 서버 2008 +의 경우 ... MERGE보다는 독점 UPDATE를 사용.

    구문은 어떤 매력을 가지고 FROM SQL 서버 2008 +의 경우 ... MERGE보다는 독점 UPDATE를 사용.

    인 다중 오히려 결정적 (undeterministic) 될 최종 결과를 갖는 것보다 (업데이트에서 사용하기 때문에 다수의 가능한 다른 값)의 소스 측의 행 합류 아니라 표준 SQL있어 이식성되는대로도의 경우에 오류를 발생 하겠지만 .

    MERGE INTO Sales_Import
       USING RetrieveAccountNumber
          ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
    WHEN MATCHED THEN
       UPDATE 
          SET AccountNumber = RetrieveAccountNumber.AccountNumber;
    

    불행하게도 선택은 어느 사용하지만 선호하는 스타일에 순수하게 내려 오지 않을 수 있습니다. SQL Server의 MERGE의 구현은 다양한 버그와 고통되었습니다. 아론 버트 랜드는 여기에보고 된 것들의 목록을 컴파일하고있다.

  4. ==============================

    4.미래의 개발자를위한 일반 대답.

    미래의 개발자를위한 일반 대답.

    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;
    
  5. ==============================

    5.PostgreSQL의 경우 :

    PostgreSQL의 경우 :

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

    6.내가 제대로, 그것은 다음과 같이 이루어집니다 기억한다면 당신은, 다음, MSSQL을 사용하는 것 같습니다 :

    내가 제대로, 그것은 다음과 같이 이루어집니다 기억한다면 당신은, 다음, MSSQL을 사용하는 것 같습니다 :

    UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
    RetrieveAccountNumber.AccountNumber 
    FROM RetrieveAccountNumber 
    WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
    
  7. ==============================

    7.나는 줄에 일치하는 키가 없었 foo는 행에 null로 foo.new 존재 세트와 같은 문제가 있었다. 나는 오라클이 뭔가를했다 :

    나는 줄에 일치하는 키가 없었 foo는 행에 null로 foo.new 존재 세트와 같은 문제가 있었다. 나는 오라클이 뭔가를했다 :

    update foo
    set    foo.new = (select bar.new
                      from bar 
                      where foo.key = bar.key)
    where exists (select 1
                  from bar
                  where foo.key = bar.key)
    
  8. ==============================

    8.MySQL을위한 그 잘 작동합니다 :

    MySQL을위한 그 잘 작동합니다 :

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

    9.여기에 SQL 서버에서 나를 위해 일한 내용은 다음과 같습니다

    여기에 SQL 서버에서 나를 위해 일한 내용은 다음과 같습니다

    UPDATE [AspNetUsers] SET
    
    [AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
    [AspNetUsers].[Name] = [UserProfile].[Name]
    
    FROM [AspNetUsers], [UserProfile]
    WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
    
  10. ==============================

    10.응답 주셔서 감사합니다. 나는 상점 해결책을 발견했다.

    응답 주셔서 감사합니다. 나는 상점 해결책을 발견했다.

    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)  
    
  11. ==============================

    11.경우에 테이블이 다른 데이터베이스에 있습니다. (SQLSERVER)

    경우에 테이블이 다른 데이터베이스에 있습니다. (SQLSERVER)

    update database1..Ciudad
    set CiudadDistrito=c2.CiudadDistrito
    
    FROM database1..Ciudad c1
     inner join 
      database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
    
  12. ==============================

    12.ID에 따라 표 2와 표를 업데이트 쿼리의 다음 블록을 사용합니다 :

    ID에 따라 표 2와 표를 업데이트 쿼리의 다음 블록을 사용합니다 :

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

    이것은이 문제를 해결하는 가장 쉬운 방법입니다.

  13. ==============================

    13.MS SQL

    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';
    

    오라클 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  ;
    
  14. ==============================

    14.같은 테이블에서 업데이트 :

    같은 테이블에서 업데이트 :

      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
    
  15. ==============================

    15.는 SQL 아래 사람이 SQL 서버에서 작동하지 않음, 제안했다. 이 구문은 나의 오래된 학교 수업을 생각 나게 :

    는 SQL 아래 사람이 SQL 서버에서 작동하지 않음, 제안했다. 이 구문은 나의 오래된 학교 수업을 생각 나게 :

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

    NOT IN 또는 NOT 사용하는 다른 모든 쿼리는 사용하지 않는 것이 좋습니다 존재한다. 영업 이익은 물론 문제가 일치됩니다의 다음 작은 부분 집합 전체 데이터 집합을 비교하기 때문에 널 (NULL)이 표시됩니다. 이것은 올바른가 NOT IN을 사용하여 닷징 문제 대신 가입으로 적절한 SQL을 작성하여 고정해야합니다. 당신은 NOT IN을 사용하여 다른 문제로 실행 또는 NOT이 경우에 존재 수 있습니다.

    SQL 서버에 가입하여 다른 테이블을 기반으로 테이블을 업데이트하는 기존의 방법입니다 상단의 하나에 대한 나의 투표. 내가 말했듯이 먼저 그들과 합류하지 않는 한, 당신은 SQL 서버에서 동일한 UPDATE 문에서 두 테이블을 사용할 수 없습니다.

  16. ==============================

    16.그것은 PostgreSQL을 함께 작동

    그것은 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
    );
    
  17. ==============================

    17.나는이 간단한 예를 들어 힘의 사람이 쉽게 그것을 얻을 것입니다 생각

    나는이 간단한 예를 들어 힘의 사람이 쉽게 그것을 얻을 것입니다 생각

            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
    
  18. ==============================

    18.오라클 11g

    오라클 11g

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

    19.이것은 당신이 다른 테이블에서 발견되지 않는 열 값을 기준으로 테이블을 업데이트 할 수 있습니다.

    이것은 당신이 다른 테이블에서 발견되지 않는 열 값을 기준으로 테이블을 업데이트 할 수 있습니다.

        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
        )
    
  20. ==============================

    20.이 시도 :

    이 시도 :

    UPDATE
        Table_A
    SET
        Table_A.AccountNumber = Table_B.AccountNumber ,
    FROM
        dbo.Sales_Import AS Table_A
        INNER JOIN dbo.RetrieveAccountNumber AS Table_B
            ON Table_A.LeadID = Table_B.LeadID 
    WHERE
        Table_A.LeadID = Table_B.LeadID
    
  21. ==============================

    21.나는 1 개의 여분의 일을 추가하고 싶습니다.

    나는 1 개의 여분의 일을 추가하고 싶습니다.

    동일 값의 값을 갱신하지 않는, 그것은 추가 기록 불필요한 오버 헤드를 발생한다. 아래의 예를 참조하십시오 - 그것은 단지 3에 연결에도 불구하고이 개 기록에 업데이트를 수행합니다.

    DROP TABLE #TMP1
    DROP TABLE #TMP2
    CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
    CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))
    
    INSERT INTO #TMP1 VALUES
    (147,'5807811235')
    ,(150,'5807811326')
    ,(185,'7006100100007267039');
    
    INSERT INTO #TMP2 VALUES
    (147,'7006100100007266957')
    ,(150,'7006100100007267039')
    ,(185,'7006100100007267039');
    
    UPDATE A
    SET A.AccountNumber = B.AccountNumber
    FROM
        #TMP1 A 
            INNER JOIN #TMP2 B
            ON
            A.LeadID = B.LeadID
    WHERE
        A.AccountNumber <> B.AccountNumber  --DON'T OVERWRITE A VALUE WITH THE SAME VALUE
    
    SELECT * FROM #TMP1
    
  22. ==============================

    22.이 시도를 위해 위의 답변이 작동하지 않는 경우

    이 시도를 위해 위의 답변이 작동하지 않는 경우

    Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
    Set A.AccountNumber = B.AccountNumber
    where A.LeadID = B.LeadID 
    
  23. from https://stackoverflow.com/questions/224732/sql-update-from-one-table-to-another-based-on-a-id-match by cc-by-sa and MIT license