2014-11-24 1 views
1

У меня есть таблица 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.

ответ

2

Это две части. Один получает правильные записи для обновления. .. Я думаю, что вы можете сделать это с in с подзапроса (или с помощью exists) Другой является update я считаю, что следующий будет работать в SQL Server и Oracle, и, вероятно, Firebird:

update allocations a 
    set task_id = (select min(t.task_id) 
        from task t 
        where t.group_id = a.task_id and 
         t.planttype = 0 
       ) 
    where a.task_id in (select t.task_id from task t where t.planttype = 1); 
+0

Спасибо. Я понимаю, почему у вас так много золотых значков ;-) –

0

Я думаю, что это будет работать :

update allocations a1 
    set task_id = 
    (
select min (task_id) 
    from task 
    where group_id = a1.task_id); 
Смежные вопросы