У меня есть таблица task
, содержащая, например,Обновить запрос для исправления неверных ссылок между двумя таблицами
task_id group_id plantype
1 0 1
13 1 0
14 1 0
15 1 0
Это указывает на задачи 13,14,15 сгруппированы по задаче 1.
Поле plantype
также указывает, если мы имеем дело с группой или нет.
У меня есть вторая таблица allocations
содержащие распределения для задач (N-1), то есть он также содержит полю task_id
Есть записи в allocations
которые неправильно указывают на группы записей (остатки более ранней конверсии, которые имели ошибки):
alloc_id task_id
xxx 1
Они должны указывать на «первой» задачи в рамках этой группы, «первый» самый низкий task_id
alloc_id task_id
xxx 13
Как мне создать запрос на обновление?
Нарушитель распределение легко найти, потому что группы не могут иметь распределения:
select a.alloc_id,t.task_id from alloc a, task t
where a.task_id=t.task_id
and coalesce(t.plantype,0) = 1
Я нуждался бы в task_id
сек оттуда как group_id
определить min(task_id)
для, и мне нужно бы allocid
s для выбора записей перерасчета обновить
Определение минимального task_id
для группы:
select group_id,min(task_id) as task_min_id
from task
group by group_id
Сборка все это начинает выглядеть следующим образом:
update alloc
set task_id =
(
select min(task_id) as task_min_id
from task
where group_id =
(
select t.task_id from alloc a, task t
where a.task_id=t.task_id
and coalesce(t.plantype,0) = 1
)
group by group_id
)
where alloc_id in
(
select a.alloc_id from alloc a, task t
where a.task_id=t.task_id
and coalesce(t.plantype,0) = 1
)
но я скрутки здесь. Это само по себе дает «несколько строк в одиночном выборе». Я попытался добавить другие псевдонимы таблиц, но я сомневаюсь, что оба подзаголовка на alloc a, task t
будут синхронизированы.
Каков должен быть мой запрос?
Я пытаюсь в Firebird прямо сейчас, но я должен заставить это работать и в SQL Server, и в Oracle.
Спасибо. Я понимаю, почему у вас так много золотых значков ;-) –