我正在尝试使用另一个表中的数据更新表。 数据是为了保持简单而编写的
PROJECT (表格)
ID FK_INCIDENT-ID DAYS
---------------------------
01 10 0
02 20 0
INCIDENT (表格)
ID FK_PRIORITY-ID
------------------
10 100
20 200
优先级(表格)
ID DAYS
---------
100 1
200 2
我需要做的是将DAYS从PRIORITY复制到PROJECT中的DAYS,并将它们绑定在一起。
更新到PROJECT表后,它应该是这样的
ID FK_INCIDENT-ID DAYS
---------------------------
01 10 1
02 20 2
PROJECT与PRIORITY的唯一关系是通过INCIDENT。
FK_INCIDENT-ID(在PROJECT中)到FK_PRIORITY-ID(在INCIDENT中)到ID(在PRIORITY中)
update (select i.ID, pro.Days, pri.Days AS Days2
from incident i
left join project pro on (i.id = pro.FK_Incident-id)
left join priority pri on (i.Fk_priority-id = pri.id)
where pro.days = 0) t
set t.Days = t.Days2
感谢您提供的任何帮助。
答案 0 :(得分:0)
在我看来,查询中的第一个连接无效:我认为,你应该用(i.id = pro.FK_INCIDENT-ID)替换(i.FK_Incident-id = pro.id)。
此外,here is nice explanation on the topic of key-preserved tables
答案 1 :(得分:0)
你似乎是以错误的顺序加入你的桌子,因为你所描述的关系;你说:
FK_INCIDENT-ID(在PROJECT中)到FK_PRIORITY-ID(在INCIDENT中)到ID(在PRIORITY中)
但您要加入INCIDENT
加入PROJECT
加注PRIORITY
。
这就是你收到错误的原因。您的架构中没有任何东西可以阻止事件映射到多个项目,左外连接意味着同一事件可以多次出现,即使它没有,如果它只出现一次,那么您不一定知道如何回到正确的记录进行更新。
如果您重新订购内联视图查询以将PROJECT
加入INCIDENT
到PRIORITY
,那么它可以正常运行(使用有效名称):
update (
select i.ID, pro.Days, pri.Days AS Days2
from project pro
left join incident i on (i.id = pro.incident_id)
left join priority pri on (pri.id = i.priority_id)
where pro.days = 0) t
set t.Days = t.Days2;
为什么days
值完全归一化到project
表中呢?或者它是否意味着其他东西(比如实际的解决时间,而不是来自优先级的目标),而你只是假设没有设置它的项目最差?虽然这似乎在incident
水平更合适,但我想。或者,这当然可以弥补......