SQL для обновления таблицы из другой таблицы с каждой таблицей есть условие, не работает - PullRequest
0 голосов
/ 16 апреля 2019

Прежде всего, я не очень хорошо разбираюсь в DB2 SQL.

У меня есть TABLE и TABLE B. TABLE содержит данные последней модификации, в то время как TABLE B содержит историю данных / запись трека из таблицы TABLE.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.ID = TABLEB.ID

Я пытался обновить TABLEA с помощью следующих 3 SQL , но так и не получилось:

 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 Ответ

0 голосов
/ 17 апреля 2019

Похоже, ваши даты не конвертируются должным образом.Оптимизатор может преобразовывать ваш 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 <>  '' ;
...