我有一张表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中使用它。
答案 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);