Поле DB2 UPDATE в таблице на основе значения в объединенной таблице. [Дубликат]

Помимо всех (хорошо объясненных) ответов, не было упомянутых ниже, и я часто посещаю этот Q & amp; A.

В двух словах; MySQL думает, что вы хотите сделать математику в своей таблице / столбце и интерпретируете дефисы, такие как «электронная почта», как e минус mail.


Отказ от ответственности: Поэтому я думал, что добавлю это как ответ типа «FYI» для тех, кто совершенно не знаком с работой с базами данных, и которые могут не понимать уже описанные технические термины.

1
задан Jenz 25 April 2014 в 06:54
поделиться

5 ответов

Я уверен (хотя я не использовал 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
2
ответ дан Joachim Isaksson 24 August 2018 в 04:49
поделиться

ответ на ваш вопрос

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)
)   
0
ответ дан Esperento57 24 August 2018 в 04:49
поделиться

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() для присвоения значения по умолчанию.

2
ответ дан mustaccio 24 August 2018 в 04:49
поделиться
UPDATE USERS.A A SET A.NAME=(SELECT B.NAME FROM USERS.B B  WHERE A.ID=B.ID );
0
ответ дан Petter Friberg 24 August 2018 в 04:49
поделиться

Если вы хотите использовать 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 
        )
0
ответ дан WarrenT 24 August 2018 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: