sql-server update문 - ID 일치에 따라 한 테이블에서 다른 테이블로 SQL 업데이트




mssql use (17)

account numberscard numbers 가있는 데이터베이스가 account numbers . 이 번호를 파일에 연결하여 카드 번호를 계정 번호로 update 하여 계정 번호로만 작업합니다.

Table ID 와 관련 계정 번호를 반환하기 위해 테이블을 계정 / 카드 데이터베이스에 연결하는보기를 만들었습니다. 이제 ID 번호가 계정 번호와 일치하는 레코드를 업데이트해야합니다.

account number 필드를 업데이트 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 로 대체 NULL


Answers

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

잘 작동하는 MySql :

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

다음은 SQL Server에서 저에게 도움이되었습니다.

UPDATE [AspNetUsers] SET

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

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

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

SQL 서버

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

오라클 (및 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;

저는 이것이 이것이 누군가를 쉽게 이해할 수있는 간단한 예라고 생각했습니다.

        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

MSSQL을 사용하고있는 것 같습니다. 올바르게 기억하면 다음과 같이 처리됩니다.

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[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 문에서 두 테이블을 먼저 조인하지 않으면 두 테이블을 사용할 수 없습니다.


이 시도 :

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

나는 bar 에서 일치하는 키가없는 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)

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

  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

위의 답변이 적합하지 않은 경우

Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID 

이렇게하면 다른 테이블에서 찾을 수없는 열 값을 기반으로 테이블을 업데이트 할 수 있습니다.

    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
    )

PostgreSQL의 경우 :

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

답변 주셔서 감사합니다. 나는 tho 해결책을 발견했다.

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 2008 +의 독점적 인 UPDATE ... FROM 구문 대신 MERGE 사용하면 몇 가지 매력이 있습니다.

뿐만 아니라 표준 SQL되고 따라서 더 많은 휴대용 그것은 또한 최종 결과가 undeterministic 수 있도록하는 대신 원본 측면에 여러 조인 된 행 (따라서 업데이트에 사용할 여러 가능한 다른 값)이있을 경우 오류를 발생시킵니다 .

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는 보고 된 목록을 여기에 정리했습니다.


다음 쿼리 블록을 사용하여 ID를 기반으로 Table1을 Table2로 업데이트하십시오.

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

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


누군가가 목표로 삼고있는 테이블에 상관없이 한 데이터베이스에서 다른 데이터베이스로 데이터를 업데이트하려는 경우이를 수행하기위한 기준이 있어야합니다.

이것은 모든 수준을 위해 더 낫고 청결하다 :

update dbname1.content targetTable

left join dbname2.someothertable sourceTable on
    targetTable.compare_field= sourceTable.compare_field
set
    targetTable.col1  = sourceTable.cola
    ,targetTable.col2 = sourceTable.colb 
    ,targetTable.col3 = sourceTable.colc 
    ,targetTable.col4 = sourceTable.cold 

Traaa! 그것은 위대한 작품!

위의 이해를 바탕으로 작업을 수행하기 위해 설정된 필드와 "on"기준을 수정할 수 있습니다. 검사를 수행 한 다음 데이터를 임시 테이블로 가져온 다음 위의 구문을 사용하여 테이블과 열 이름을 바꿔 업데이트를 실행할 수도 있습니다.

나에게 알려주지 않으면 그것이 효과가 있기를 바랍니다. 나는 정확한 질문을 쓸 것이다.





sql sql-server select join sql-update