Я пытаюсь использовать этот оператор обновления, чтобы заполнить имя столбца в таблице с именем MD001 из таблицы с именем «Пациент».
MD001(MRN, Имя, Адрес)
Пациент(Номер дела, FName, MName, LName,...)
UPDATE QS36F.MD001 m
SET NAME =
(
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
)
where m.MRN = (SELECT caseno FROM qs36f.patient WHERE caseno = m.MRN)
Я продолжаю получать результат SELECT более чем в одной строке. однако в обеих таблицах MRN и CaseNo являются первичными ключами.
Ваш подвыбор возвращает все строки с непустым именем.
Попробуй это:
UPDATE QS36F.MD001 m
SET NAME = (
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE caseno = m.MRN
)
WHERE m.MRN IN (
SELECT caseno
FROM qs36f.patient
WHERE fname <> '' AND mname <> '' AND lname <> ''
)
Я в основном поменял предложенияwhere. Внешнее предложениеwhere выбирает всех пациентов, которых вы хотите обновить, а внутреннее предложение объединяет определенные записи для обновления.
Не уверен, что вы пытаетесь сделать, но сначала заставьте оператор select работать.
select name,
(
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
and caseno = m.MRN
)
from QS36F.MD001 m
where name <>
(
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
and caseno = m.MRN
)
Затем сделайте заявление об обновлении
update QS36F.MD001 m
set name =
(
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
and caseno = m.MRN
)
where name <>
(
SELECT FName || ' ' || Mname || ' ' || LName
FROM QS36F.PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
and caseno = m.MRN
)
И вам, вероятно, понадобится несколько обрезков.
Поскольку здесь вы получили два разных ответа, вы также можете использовать CTE. With
— это внутренний оператор выбора в DB2. Вы можете достичь только с помощью одного утверждения.
Я только что изменил несколько вещей в вашем коде.
with U as (
select count (1) as dummy from new table(
update MD001 m
SET NAME = (
SELECT FName || ' ' || Mname || ' ' || LName
FROM PATIENT
WHERE fname <> '' AND mname <> '' AND lname <> ''
)
where m.MRN = (SELECT caseno FROM patient WHERE caseno = m.MRN)
))
select * from MD001
Ошибка SQL [42601]: [SQL0199] ОБНОВЛЕНИЕ ключевого слова не ожидается. Допустимые токены: INSERT.
Причина ошибки: вы используете продукт, отличный от Db2. Пожалуйста, получите логический ответ здесь. dba.stackexchange.com/questions/232659/….
Я спрашивал, и никто не ответил, но я уверен, что они не используют DB2 или Windows, и, поскольку они называют это As/400, я думаю, что это db2 для i.
@user10191234 user10191234 Можете ли вы запустить этот код? dbfiddle.uk/L1HaGptl --- Я менял последнее условие. Дайте мне знать, соответствует ли он вашим требованиям.
@ user10191234 Да, DB2 для i. В скрипте DB2 для LUW указан как DB2, но это не то же самое. DB2 for i не поддерживает этот синтаксис с UPDATE, только с INSERT.
Первый подзапрос также нуждается в этих условиях.