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

У меня есть таблица:

ID      DATE            RANGE       STATUS
--------------------------------------------
123     30-SEP-2019     000         C
123     30-SEP-2019     001         NULL
345     25-SEP-2019     000         C
345     30-SEP-2019     001         NULL
567     30-SEP-2019     000         C
567     30-SEP-2019     001         NULL
789     27-SEP-2019     000         C
789     30-SEP-2019     001         NULL

Записи с одним и тем же идентификатором (например, 123) считаются одной и той же записью с другим диапазоном. Мне нужно обновить STATUS для записей 001 RANGE до Y, для которого запись 000 RANGE должна иметь дату 30-SEP-2019.

Пример. Запрос на обновление должен обновить STATUS до «Y» для записи с идентификатором «123» и RANGE - «001», потому что для идентификатора «123» с RANGE - «000» DATE записи равен «30 -SEP-2019' . Также он должен обновить STATUS для 001 RANGE записи с идентификатором - 567.

Он не должен обновлять STATUS для 001 RANGE для идентификаторов 789 и 345, потому что DATE записи 000 RANGE не равен 30-СЭП-2019.

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 21 октября 2019

На ум приходит коррелированный подзапрос с фильтрацией:

update t
    set status = (select t2.status
                  from t t2
                  where t2.id = t.id and t2.range = '000'
                 )
    where date = '2019-09-30' and range = '001';
0 голосов
/ 21 октября 2019

Обновление с самостоятельным объединением:

update t
set status = 'Y'
from tablename t inner join tablename tt
on t.id = tt.id and t.date = tt.date and t.status is null and tt.status is not null

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

WHERE t.range = '001' and tt.range = '000'

См. демо . Результаты:

 ID | DATE        | RANGE | STATUS
--: | :---------- | ----: | :-----
123 | 30-SEP-2019 |     0 | C     
123 | 30-SEP-2019 |     1 | Y     
345 | 25-SEP-2019 |     0 | C     
345 | 30-SEP-2019 |     1 | null 
567 | 30-SEP-2019 |     0 | C     
567 | 30-SEP-2019 |     1 | Y     
789 | 27-SEP-2019 |     0 | C     
789 | 30-SEP-2019 |     1 | null
0 голосов
/ 21 октября 2019

В качестве альтернативы, если ответ Гордона верный, вы можете использовать JOIN:

UPDATE T1
SET status = T2.Status
FROM YourTable T1
     JOIN YourTable T2 ON t1.id = t2.id
WHERE T1.[date] = '20190930'
  AND T1.range = '001'
  AND T2.range = '000';
...