2016-04-13 3 views
0

Я немного борюсь с SQL-запросом. У нас есть некоторые адреса, у которых неправильные даты начала, но CREATE Dates верны.Обновление нескольких строк с разными значениями - инструкция THEN

Цель состоит в том, чтобы обновить около 4000 записей вместо того, чтобы идти один за другим. Я знаю, что я могу сделать это на основе Person_ID, но это будет очень трудоемким. Проблема заключается в том, что оператор Then, потому что мне нужно выбрать значение, которое находится в одной строке, поэтому, возможно, мне нужно сначала объявить значение, но я не уверен, как это уместиться?

update ADDRESS 
set START_DATE = CASE 
    when STATUS = 'Inactive' and START_DATE = '1900-01-01' 
    then (select CREATE_DATE from ADDRESS where STATUS = 'Inactive' and START_DATE = '1900-01-01') 
    else END_DATE end 
where STATUS = 'Inactive' and START_DATE = '1900-01-01' and PEOPLE_ID IN (select PEOPLE_ID from ADDRESS where START_DATE = '1900-01-01' and STATUS = 'Inactive') 

Я понимаю, что некоторые строки имеют утверждения, которые могут быть излишними. PEOPLE_ID должен, вероятно, как-то соответствовать правилу выбора THEN Statement?

+0

ли ваша цель просто обновить 'start_date' до' create_date' для неактивных записей с неправильной датой начала? – Quassnoi

+0

@Quassnoi - Да. Существует идентичная фильтрация в трех разных местах, и попытка использования PEOPLE_ID в предложении WHERE не требуется. Просто найдите START_DATE = '1900-01-01' и STATUS = 'inactive', а затем выполните то, что у вас есть в вашем ответе. Даже если вы не хотите устанавливать START_DATE в END_DATE, если это правильно установленное значение. – Dresden

+0

@Quassnoi да, это именно то, что я пытаюсь сделать! Запрос работает в моей тестовой БД. Спасибо! – Nestalna

ответ

2
UPDATE address 
SET  start_date = create_date 
WHERE status = 'inactive' 
     AND start_date = '1900-01-01' 
0
update ADDRESS 
set START_DATE = CASE when STATUS = 'Inactive' and START_DATE = '1900-01-01' 
          then (select CREATE_DATE 
            from ADDRESS 
            where STATUS = 'Inactive' 
            and START_DATE = '1900-01-01') 
         else END_DATE 
       end 
where STATUS = 'Inactive' and START_DATE = '1900-01-01' 
    and PEOPLE_ID IN (select PEOPLE_ID 
         from ADDRESS 
        where START_DATE = '1900-01-01'and STATUS = 'Inactive') 

выше ваше обновление - только что отформатированный
это перепутались на многих уровнях у вас есть:

where STATUS = 'Inactive' and START_DATE = '1900-01-01' 

три разные времена и четыре раз разные, но странный сам по себе

CASE when STATUS = 'Inactive' and START_DATE = '1900-01-01' 

всегда гонг, чтобы быть правдой, так как это, где

это не делает ничего, как у вас уже есть в где

and PEOPLE_ID IN (select PEOPLE_ID 
          from ADDRESS 
         where START_DATE = '1900-01-01'and STATUS = 'Inactive') 

это возвращает Mutiple значения одного обновления

then (select CREATE_DATE 
     from ADDRESS 
     where STATUS = 'Inactive' 
     and START_DATE = '1900-01-01') 
Смежные вопросы