Помимо всех (хорошо объясненных) ответов, не было упомянутых ниже, и я часто посещаю этот Q & amp; A.
В двух словах; MySQL думает, что вы хотите сделать математику в своей таблице / столбце и интерпретируете дефисы, такие как «электронная почта», как e
минус mail
.
Отказ от ответственности: Поэтому я думал, что добавлю это как ответ типа «FYI» для тех, кто совершенно не знаком с работой с базами данных, и которые могут не понимать уже описанные технические термины.
Я уверен (хотя я не использовал DB2 некоторое время), что DB2 по-прежнему не поддерживает объединения в операциях обновления, поэтому вам нужно будет использовать MERGE ;
Что-то вроде этого (освобождение от него, поскольку у меня нет DB2, поэтому может быть немного выключено);
MERGE INTO Sales_Import si
USING (SELECT AccountNumber, LeadID FROM RetrieveAccountNumber) ra
ON (si.LeadID = ra.LeadID)
WHEN MATCHED THEN
UPDATE SET AccountNumber = ra.AccountNumber
ответ на ваш вопрос
UPDATE Sales_Import f1
SET f1.AccountNumber =
(
SELECT f2.AccountNumber
FROM RetrieveAccountNumber f2
WHERE f1.LeadID = f2.LeadID
FETCH FIRST ROW ONLY
)
WHERE exists
(
SELECT * FROM RetrieveAccountNumber f2
WHERE f1.LeadID = f2.LeadID
)
шаблонный метод
update table1 f1
set (f1.field1, f1.field2, f1.field3, f1.field4)=
(
select f2.field1, f2.field2, f2.field3, 'CONSTVALUE'
from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2)
)
where exists
(
select * from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2)
)
DB2 действительно поддерживает соединения в инструкции UPDATE, но не так, как вы думаете, - DB2 следует стандарту ANSI SQL:
UPDATE
Sales_Import SI
SET
Sales_Import.AccountNumber = (
SELECT
RAN.AccountNumber
FROM
RetrieveAccountNumber RAN
WHERE
SI.LeadID = RAN.LeadID
)
Вышеупомянутое предполагает, что LeadID
однозначно идентифицирует записи в RetrieveAccountNumber
, в противном случае вы получите сообщение об ошибке, потому что подзапрос вернет более одной строки.
Edit:
Чтобы ответить на комментарии ниже, если соответствующая запись в RetrieveAccountNumber
не может быть found, Sales_Import.AccountNumber
будет установлено значение null. Если это нежелательно, можно использовать COALESCE()
для присвоения значения по умолчанию.
UPDATE USERS.A A SET A.NAME=(SELECT B.NAME FROM USERS.B B WHERE A.ID=B.ID );
Если вы хотите использовать UPDATE, а не MERGE, вы хотите обработать только соответствующие записи, в которых значение изменится.
UPDATE Sales_Import SI
SET SI.AccountNumber =
(SELECT RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE SI.LeadID = RAN.LeadID
FETCH FIRST ROW ONLY
)
WHERE SI.LeadID IN
(SELECT S2.LeadID
FROM Sales_Import S2
JOIN RetrieveAccountNumber R2
ON S2.LeadID = R2.LeadID
WHERE S2.AccountNumber <> R2.RetrieveAccountNumber
)