Обновление 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 ]

1250 голосов
/ 22 октября 2008

Полагаю, 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;
273 голосов
/ 20 января 2010

Простой способ скопировать содержимое из одной таблицы в другую:

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

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

152 голосов
/ 11 февраля 2012

Для SQL Server 2008 + использование MERGE вместо проприетарного UPDATE ... FROM синтаксиса имеет некоторую привлекательность.

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

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

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

68 голосов
/ 29 августа 2016

Общий ответ для будущих разработчиков.

SQL Server

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

Oracle (и 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;
34 голосов
/ 22 октября 2008

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

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
31 голосов
/ 29 апреля 2009

У меня была та же проблема с foo.new, установленным на null для строк foo, у которых не было соответствующего ключа в bar. Я сделал что-то подобное в Oracle:

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)
28 голосов
/ 16 июля 2014

Для PostgreSQL:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 
27 голосов
/ 13 февраля 2012

Для MySql, который отлично работает:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID
16 голосов
/ 22 октября 2008

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

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)  
14 голосов
/ 07 сентября 2018

Вот что у меня работало в SQL Server:

UPDATE [AspNetUsers] SET

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

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...