2017-02-22 14 views
0

Мне нужна помощь в преобразовании оператора select в инструкцию обновления, чтобы обновить значение field_ind до Y. Первичный ключ в table_1 находится на field_id,create_date. Здесь оператор выбора используется для поиска записей, мне нужно обновить:Oracle - Справка по созданию инструкции обновления (в режиме ожидания)

SELECT cd.field_id, cd.create_date, cd.field_ind FROM table_1 cd 
    JOIN table_2 ct 
    ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
    ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
WHERE cd.create_date IN (SELECT MAX(create_date) 
          FROM table_1 
          WHERE field_id = ct.field_id); 

Образец данных:

FIELD_ID CREATE_DATE FIELD_IND 
    123 1/1/2016   N 
    123 2/1/2017   N 
    456 1/1/2016   N 
    456 3/1/2017   N 
    789 1/1/2015   N 
    789 1/31/2017   N 

Ожидаемые результаты:

FIELD_ID CREATE_DATE FIELD_IND 
    123 1/1/2016   N 
    123 2/1/2017   Y 
    456 1/1/2016   N 
    456 3/1/2017   Y 
    789 1/1/2015   N 
    789 1/31/2017   Y 

Любая помощь приветствуется. Благодарю.

+0

Обновить его, где и на что? Примеры данных и ожидаемые результаты могут помочь прояснить, что вы имеете в виду. –

+0

Обновление поля field_ind в таблице_1. – user3224907

+0

Но к чему? Ваш запрос получает этот столбец - вы хотите обновить его до того же значения, которое у него уже есть? Или вы хотите обновить все строки для идентификатора, чтобы иметь то же значение, что и значение из строки с самой последней датой создания для этого идентификатора? –

ответ

0

Вам нужно всего лишь незначительное изменение подхода Ersin, чтобы включать дату создания в новой версии:

UPDATE table_1 
SET field_ind = 'Y' 
WHERE (field_id, create_date, field_ind) IN (
    SELECT cd.field_id, cd.create_date, cd.field_ind FROM table_1 cd 
    JOIN table_2 ct 
     ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
     ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
    WHERE cd.create_date IN (SELECT MAX(create_date) 
           FROM table_1 
          WHERE field_id = ct.field_id) 
); 

3 rows updated. 

select * from table_1 order by field_id, create_date; 

    FIELD_ID CREATE_DAT F 
---------- ---------- - 
     123 2016-01-01 N 
     123 2017-02-01 Y 
     456 2016-01-01 N 
     456 2017-03-01 Y 
     789 2016-01-01 N 
     789 2017-01-31 Y 

В основном вы должны коррелировать обновление с обеими ключевыми областями, если вы хотите только строки, определенных ваш запрос должен быть обновлен. (Это было не совсем ясно из ваших предыдущих образцов данных/результатов, ответ Эрсина работал на то, что вы показали, но не на ситуацию, о которой вы теперь объяснили.) В том числе field_ind не нужно, но поскольку у вас есть это в оригинале запрос Я включил его в предложение IN - его можно было удалить из обоих.

Вы можете избавиться от подзапроса в вашем первоначальном запросе, и, следовательно, немного упростить обновление тоже что-то вроде:

UPDATE table_1 
SET field_ind = 'Y' 
WHERE (field_id, create_date) IN (
    SELECT cd.field_id, 
     max(cd.create_date) keep (dense_rank last order by create_date) 
      as create_date 
    FROM table_1 cd 
    JOIN table_2 ct 
     ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
     ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
    GROUP BY cd.field_id 
); 

который обновляет ту же три строки. Я думаю, что это эквивалентно здесь, в зависимости от условий соединения, которые вы показали.

Смежные вопросы