#sql #db2 #sql-update #db2-400
#sql #db2 #sql-обновление #db2-400
Вопрос:
Прежде всего, я не очень хорошо разбираюсь в DB2 SQL.
У меня есть ТАБЛИЦА и ТАБЛИЦА B. ТАБЛИЦА A содержит данные последнего изменения, в то время как ТАБЛИЦА B содержит историю / запись данных из таблицы ТАБЛИЦА A.
Я хочу обновить столбец TABLEA.LAST_PRICE (с условиями DEAL_DATE = ‘1753-01-01’ и CODE <> «), заполненный TABLEB.LAST_PRICE (с условием DEAL_DATE <> ‘1753-01-01’ и CODE <> » и упорядочить по CHANGE_DATE desc limit 1), где внешний ключ для двух таблиц — TABLEA.ИДЕНТИФИКАТОР = TABLEB.ID
- Таблицу A можно увидеть здесь: введите описание изображения здесь
- Таблицу B можно увидеть здесь: введите описание ссылки здесь
Я попытался обновить таблицу следующими 3 SQLL, но так и не добился успеха:
1. update DB.TABLEA as a set a.LAST_PRICE = (select LAST_PRICE from
DB.TABLEB as b where b.DEAL_DATE <> '1753-01-01' and a.ID = b.ID and
b.CODE <> '' order by b.CHANGE_DATE desc FETCH FIRST 1 ROWS ONLY)
where a.DEAL_DATE = '1753-01-01' and a.CODE <> '' ;
2. update DB.TABLEA as a set a.LAST_PRICE = (select LAST_PRICE from
DB.TABLEB as b where b.DEAL_DATE <> '1753-01-01' and a.ID = b.ID and
b.CODE <> '' order by b.CHANGE_DATE desc limit 1) where a.DEAL_DATE = '1753-01-01' and a.CODE <> '' ;
3. update DB.TABLEA set a.LAST_PRICE = b.LAST_PRICE from DB.TABLEA a
join DB.TABLEB b on a.ID = b.ID where a.DEAL_DATE = '1753-01-01'
and a.CODE <> '' and b.DEAL_DATE <> '1753-01-01' and b.CODE <> ''
order by b.CHANGE_DATE desc FETCH FIRST 1 ROWS ONLY;
Я схожу с ума от этого запроса.
Спасибо за любую помощь.
Комментарии:
1. Если TABLEA и TABLEB находятся в разных БД, вы можете обновить или вставить. Выберите только удаленную работу с DB2.
2. Пожалуйста, создайте воспроизводимый пример, включающий следующие инструкции для обеих таблиц: определение таблицы (
CREATE TABLE
),INSERT INTO
инструкции с 2-3 строками для некоторого определенного идентификатора.3. Привет, Нифриз, спасибо за ответ. TABLEA и TABLEB находятся в одной базе данных. я хочу обновить TABLEA для записи, взяв ее из TABLEB. но о трех моих sql не работает.
4. Вы получаете ошибку SQLSTATE / SQLCODE?
Ответ №1:
Похоже, что ваши даты не преобразуются должным образом. Возможно, оптимизатор преобразует ваш TABLEB DEAL_DATE в временную метку, а затем символ, который не будет соответствовать чисто символьной строке. При сравнении дат обычно лучше сравнивать их как фактические даты, а не только их представления.
update DB.TABLEA as a set a.LAST_PRICE = (select LAST_PRICE from
DB.TABLEB as b where cast(b.DEAL_DATE as date) <> cast('1753-01-01' as date) and a.ID = b.ID and
b.CODE <> '' order by b.CHANGE_DATE desc FETCH FIRST 1 ROWS ONLY)
where cast(a.DEAL_DATE as date) = cast('1753-01-01' as date) and a.CODE <> '' ;