values - update select join sql server




ID 일치에 따라 한 테이블에서 다른 테이블로 SQL 업데이트 (13)

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

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

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


PostgreSQL의 경우 :

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

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

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

나는 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)

나는 여분의 것을 하나 추가하고 싶다.

값을 동일한 값으로 업데이트하지 않으면 여분의 로깅과 불필요한 오버 헤드가 발생합니다. 아래 예제를 참조하십시오. - 3에 링크되어 있음에도 불구하고 2 개의 레코드에 대해서만 업데이트를 수행합니다.

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

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

UPDATE Sales_Import, RetrieveAccountNumber 
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
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];

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

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;

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

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

잘 작동하는 MySql :

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

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

        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

이 시도 :

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






sql-update