SQL обновление из одной таблицы в другую на основе совпадения 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.

Я считаю, что UPDATE FROM с JOIN поможет:

MS SQL

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;
Комментарии (14)

Простой способ для копирования содержимого с одного стола на другой, как следовать:

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

Вы также можете добавить условие, чтобы получить определенные данные скопированы.

Комментарии (2)

Для SQL Server 2008 С + через "слияние", а не обновить проприетарные ... от синтаксис имеет некоторую привлекательность.

А также стандартный SQL и, следовательно, более портативный, он также выдает ошибку, в случае наличия нескольких соединенных строк на стороне источника (и таким образом, возможно несколько разные значения для использования в Update), а не конечный результат будет undeterministic.

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

К сожалению, выбор не может прийти, однако исключительно предпочитаемый стиль. Реализация слияние в SQL-сервер, страдающих от различных жучков. Аарон Бертран был составлен список из сообщенных здесь.

Комментарии (10)

Универсального ответа для будущих разработчиков.

<Н1>SQL-сервер</Н1>

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

<Н1>СУБД Oracle (SQL сервера)</Н1>

UPDATE 
     t1
SET 
     t1.colmun = t2.column 
FROM 
     Table1 t1, 
     Table2 t2 
WHERE 
     t1.ID = t2.ID;

<Н1>для MySQL</Н1>

UPDATE 
     Table1 t1, 
     Table2 t2
SET 
     t1.column = t2.column 
WHERE
     t1.ID = t2.ID;
Комментарии (2)

Похоже, вы используете MSSQL, тогда, если я правильно помню, это делается следующим образом:

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Комментарии (0)

У меня была такая же проблема на <код>В ФОО.новый</код> установлен в <код>нуль</код> для строки состояния <код>фу</код> что имел найденный ключ в в <код>В баре</код>. Я сделал что-то подобное в Oracle:

в <предварительно> обновление ФОО набор ФОО.новый = (выберите бар.новый из бара где Foo.ключ = бар.ключ) где существует (выберите 1 из бара где Foo.ключ = бар.ключ) </пред>

Комментарии (4)

Для PostgreSQL:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 
Комментарии (0)

Для MySQL, который прекрасно работает:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID
Комментарии (0)

Здесь's что работал для меня в SQL сервере:

UPDATE [AspNetUsers] SET

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

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Комментарии (1)

Спасибо за ответы. Я нашел решение.

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)  
Комментарии (3)

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

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

Это *легкий способ для решения этой проблемы.

Комментарии (0)

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

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
Комментарии (0)

обновление в пределах одной и той же таблице:

  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
Комментарии (0)

он работает с 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)

Ниже в SQL кто-то предложил, не работает в SQL сервере. Этот синтаксис напоминает мне мой старый школьный класс:

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

Все другие запросы, используя не в или нет не рекомендуются. Нули показывают, потому что ОП сравнивает весь набор данных с небольшого подмножества, то конечно там будут соответствующие проблемы. Это должно быть исправлено путем написания соответствующего SQL с правильным "присоединиться", а не проблема уворачиваясь с помощью не. Вы можете столкнуться с другими проблемами с помощью не в или нет в этом случае.

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

Комментарии (1)

Мѕ 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)

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

        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
Комментарии (0)

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

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

    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
    )
Комментарии (0)

попробуйте этот :

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
Комментарии (0)