我们这里有三个表,Session表连接到具有Session_id字段的Green_fact表。 Time_session表是第三个表,它由Session表中的SessionDate组成,每天都有一个主键。
如何填充Green_fact表中的Date_ID字段。 下面的代码是我认为使用的,但它无法正常工作
update green_fact
inner join "SESSION" on green_fact."SESSION_ID" = "SESSION"."SessionID"
inner join "TIME_SESSION" on "TIME_SESSION"."SESSION_DATE" = "SESSION"."SessionDate"
set green_fact."DATE_ID" = "TIME_SESSION"."ID" where green_fact."SESSION_ID" = "SESSION"."SessionID";
答案 0 :(得分:2)
Oracle不允许join
中的update
。您可以使用相关子查询:
update green_fact gf
set DATE_ID = (select ts.ID
from SESSION s join
TIME_SESSION ts
on ts.SESSION_DATE = s.SessionDate
where gf.SESSION_ID = s.SESSIONID
)
where exists (select ts.ID
from SESSION s join
TIME_SESSION ts
on ts.SESSION_DATE = s.SessionDate
where gf.SESSION_ID = s.SESSIONID
);
如果所有行都匹配,则exists
可能没有必要。
答案 1 :(得分:2)
在Oracle中,您可以更新表格或更新表格查询,即UPDATE tablename SET ...
或UPDATE (SELECT ... FROM ...) SET ...
。
update
(
select gf.date_id, time_session.id as time_session_id
from green_fact gf
inner join session s on gf.session_id = s.sessionid
inner join time_session ts on ts.session_date = s.sessiondate
)
set date_id = time_session_id;
如果DBMS认为它确保查询只为每个green_fact记录产生一行(由于主键和外键,它应该这样做),这将有效。
答案 2 :(得分:1)
使用以下查询从两个表中进行更新:
UPDATE green_fact SET green_fact."DATE_ID" = A.Id
FROM
(
SELECT "TIME_SESSION"."ID" Id , "SESSION"."SessionID" SessionID
FROM "TIME_SESSION"
JOIN "SESSION" ON "TIME_SESSION"."SESSION_DATE" =
"SESSION"."SessionDate"
) A
WHERE green_fact."SESSION_ID" = A.SessionID;
答案 3 :(得分:0)
Oracle不允许在UPDATE
语句中使用连接,但有时可以将此类语句重写为MERGE
(您没有指定您正在使用的Oracle版本,但是,因为10g可以省略WHEN MATCHED
的{{1}}或WHEN NOT MATCHED
条款:
MERGE
希望这有帮助。
顺便说一句,我不能强调Oracle中的混合大小写对象名称是个坏主意。但也许您正在处理遗留数据而无法做出选择。