更新查询以修复两个表之间的错误引用

时间:2014-11-24 13:09:42

标签: sql sql-server oracle firebird

我有一张表task,包含例如。

task_id  group_id  plantype
1        0          1 
13       1          0
14       1          0
15       1          0

这表示在任务1下分组的任务13,14,15 字段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来选择要更新的分配记录

确定组的最小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 个答案:

答案 0 :(得分:2)

这有两个部分。一个是获得正确的记录更新。我认为您可以使用in使用子查询(或使用exists)来执行此操作。另一个是update。我相信以下内容适用于SQL Server和Oracle以及Firebird:< / p>

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);

答案 1 :(得分:0)

我认为这会奏效:

update allocations a1
   set task_id =
     (
 select min (task_id)
   from task
  where group_id = a1.task_id);