如何通过连接两个其他表来更新表

时间:2017-03-31 12:55:35

标签: sql database oracle

我们这里有三个表,Session表连接到具有Session_id字段的Green_fact表。 Time_session表是第三个表,它由Session表中的SessionDate组成,每天都有一个主键。

all tables

如何填充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";

4 个答案:

答案 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中的混合大小写对象名称是个坏主意。但也许您正在处理遗留数据而无法做出选择。