Oracle обновляет дублирующиеся строки в таблице - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть таблица Oracle с именем users, со столбцами

name, location, organization, valid_from, valid_to, active.

Я пытаюсь сделать следующее: если есть две записи с одинаковым именем, местоположением, организацией, но с перекрытием интервалов valid_to, valid_from,установить активный статус каждой записи на «NOK».Вот как я пытаюсь это сделать:

UPDATE table SET active= 'NOK' 
WHERE 
(name, location, organization) IN (
     SELECT t1.name, t1.location, t1.organization   
     FROM table t1
     WHERE (valid_from > t1.valid_from and valid_to < t1.valid_to )
      GROUP BY t1.name, t1.location, t1.organization   
      HAVING COUNT(*) > 1) ;

Но, похоже, это не то, что я хочу.Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Предложение WHERE в вашем подзапросе будет FALSE для всех строк, поскольку вы не указали псевдоним таблицы для некоторых столбцов:

(valid_from > t1.valid_from and valid_to < t1.valid_to )

будет означать

(t1.valid_from > t1.valid_from and t1.valid_to < t1.valid_to )

Я думаю, что это то, что вы хотите:

UPDATE table t1 SET active = 'NOK' 
WHERE EXISTS 
( SELECT 1
  FROM   table t2
  WHERE  t2.name = t1.name
  AND    t2.location = t1.location
  AND    t2.organization = t1.organization
  AND    t1.valid_from <= t2.valid_to
  AND    t2.valid_from <= t1.valid_to
  AND    t1.ROWID != t2.ROWID
);

Однако, если valid_from или valid_to могут быть нулевыми, вам нужно также обработать этот случай.

(Сравнение ROWID для предотвращения буксировоксовпадение с собой!)

0 голосов
/ 07 февраля 2012

Попробуйте так:

UPDATE table SET a.active= 'NOK' 
from table a
inner join (
     SELECT t1.name, t1.location, t1.organization   
     FROM table t1
     WHERE (valid_from > t1.valid_from and valid_to < t1.valid_to )
      GROUP BY t1.name, t1.location, t1.organization   
      HAVING COUNT(*) > 1) b
  on a.name = b.name and a.location = b.location and a.organization = b.organization;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...