Обновление SQL из одной таблицы в другую на основе идентификатора
У меня есть база данных с 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
Ответы
Ответ 1
Я считаю, что 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;
Ответ 2
Простой способ скопировать содержимое из одной таблицы в другую:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Вы также можете добавить условие для копирования конкретных данных.
Ответ 3
Для 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 вызвана различными ошибками. Аарон Бертран составил список сообщенных здесь.
Ответ 4
Общий ответ для будущих разработчиков.
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;
Ответ 5
Кажется, вы используете MSSQL, тогда, если я правильно помню, это делается следующим образом:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Ответ 6
У меня была такая же проблема, когда 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)
Ответ 7
Для PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Ответ 8
Для MySql, который отлично работает:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
Ответ 9
Вот что у меня работало в SQL Server:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Ответ 10
Спасибо за ответы. Я нашел решение 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)
Ответ 11
Для MySql:
UPDATE table1 JOIN table2
ON table1.id = table2.id
SET table1.name = table2.name,
table1.`desc` = table2.`desc`
Для Sql Server:
UPDATE table1
SET table1.name = table2.name,
table1.[desc] = table2.[desc]
FROM table1 JOIN table2
ON table1.id = table2.id
Я использовал все вышеперечисленные запросы, но они не работают; и когда я использовал этот, он сделал.
Вы также можете поймать его здесь, fooobar.com/questions/12806/...
Надеюсь, что получишь. спасибо
Ответ 12
Используйте следующий блок запроса для обновления таблицы Table1 на основе идентификатора:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Это самый простой способ решения этой проблемы.
Ответ 13
обновить в той же таблице:
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
Ответ 14
работает с 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
);
Ответ 15
Ниже предложенный 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, если вы не присоедините их первым.
Ответ 16
В случае, если таблицы находятся в другой базе данных. (SQLSERVER)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
Ответ 17
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 ;
Ответ 18
Я подумал, что это простой пример, если кому-то это станет легче,
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
Ответ 19
Я хочу добавить это обновление для кода Access SQL или VBA: мы должны сделать JOIN перед SET.
Доступ к SQL
UPDATE
Sales_Import
INNER JOIN
RetrieveAccountNumber
ON
Sales_Import.LeadID = RetrieveAccountNumber.LeadID
SET
Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
Ответ 20
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
Ответ 21
Это позволит вам обновить таблицу на основе значения столбца, которое не будет найдено в другой таблице.
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
)
Ответ 22
попробуйте следующее:
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
Ответ 23
Я хотел бы добавить еще одну вещь.
Не обновляйте значение с тем же значением, оно генерирует дополнительные протоколирования и ненужные служебные данные.
См. Пример ниже - он будет выполнять обновление только на 2 записи, несмотря на ссылку на 3.
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
Ответ 24
Если приведенные выше ответы не работают, попробуйте это
Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID