У меня есть база данных с номерами счетов
и номерами карт
. Я сопоставляю их с файлом, чтобы обновить
все номера карт на номер счета, так что я работаю только с номерами счетов.
Я создал представление, связывающее таблицу с базой данных счетов/карт, чтобы вернуть Идентификатор таблицы
и соответствующий номер счета, и теперь мне нужно обновить те записи, где идентификатор совпадает с номером счета.
Это таблица 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
поможет:
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID;
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
Простой способ для копирования содержимого с одного стола на другой, как следовать:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Вы также можете добавить условие, чтобы получить определенные данные скопированы.
Для 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-сервер, страдающих от различных жучков. Аарон Бертран был составлен список из сообщенных здесь.
Универсального ответа для будущих разработчиков.
<Н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;
Похоже, вы используете MSSQL, тогда, если я правильно помню, это делается следующим образом:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
У меня была такая же проблема на <код>В ФОО.новый</код> установлен в <код>нуль</код> для строки состояния <код>фу</код> что имел найденный ключ в в <код>В баре</код>. Я сделал что-то подобное в Oracle:
в <предварительно> обновление ФОО набор ФОО.новый = (выберите бар.новый из бара где Foo.ключ = бар.ключ) где существует (выберите 1 из бара где Foo.ключ = бар.ключ) </пред>
Здесь's что работал для меня в SQL сервере:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Спасибо за ответы. Я нашел решение.
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)
Использовать следующие блок запроса на обновление Таблица1 в Таблица2 основе идентификатора:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Это *легкий способ для решения этой проблемы.
В случае, если таблицы находятся в разных БД. (SQL сервер)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
обновление в пределах одной и той же таблице:
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
);
Ниже в 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, если вы присоединитесь к ним в первую очередь.
Мѕ 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 ;
Я думал, что это простой пример, может кто-то сделать это легче,
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 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
)
попробуйте этот :
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