Обновление SQL из одной таблицы в другую на основе совпадения идентификатора - PullRequest
843 голосов
/ 22 октября 2008

У меня есть база данных с account numbers и card numbers. Я сопоставляю их с файлом update любых номеров карт с номером счета, так что я работаю только с номерами счетов.

Я создал представление, связывающее таблицу с базой данных учетных записей / карточек для возврата Table 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

Ответы [ 22 ]

5 голосов
/ 12 ноября 2017

Используйте следующий блок запроса для обновления таблицы 1 таблицей 2 на основе идентификатора:

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

Это самый простой способ решить эту проблему.

3 голосов
/ 12 июня 2016

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 не рекомендуются. Отображаются NULL, потому что OP сравнивает весь набор данных с меньшим подмножеством, тогда, конечно, будет проблема с сопоставлением. Это должно быть исправлено путем написания правильного SQL с правильным JOIN вместо решения проблемы уклонения с использованием NOT IN. В этом случае вы можете столкнуться с другими проблемами, используя NOT IN или NOT EXISTS.

Мой голос за лучший, который является обычным способом обновления таблицы на основе другой таблицы путем присоединения к SQL Server. Как я уже сказал, вы не можете использовать две таблицы в одном и том же операторе UPDATE в SQL Server, если сначала не присоединитесь к ним.

3 голосов
/ 06 декабря 2012

обновление в той же таблице:

  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
2 голосов
/ 14 мая 2015

работает с 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
);
1 голос
/ 04 июня 2012

Я подумал, что это простой пример, может кому-то легче,

        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 голос
/ 23 апреля 2019

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  ;
0 голосов
/ 24 апреля 2019

В случае, если таблицы находятся в другой базе данных. (SQLServer)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
0 голосов
/ 21 января 2019

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 голосов
/ 10 января 2018

Если вышеуказанные ответы не работают, попробуйте это

Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID 
0 голосов
/ 02 апреля 2015

Это позволит вам обновить таблицу на основе значения столбца, не найденного в другой таблице.

    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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...