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

Sql 如何通过连接其他两个表来更新表,sql,database,oracle,Sql,Database,Oracle,这里有三个表,会话表连接到带有会话id字段的Green_事实表。Time_session table是由session table中的SessionDate组成的第三个表,它为每一天提供一个主键 如何填充绿色事实表中的日期\u ID字段。 下面的代码是我认为应该使用的,但它不能正常工作 update green_fact inner join "SESSION" on green_fact."SESSION_ID" = "SESSION"."SessionID" inner jo

这里有三个表,会话表连接到带有会话id字段的Green_事实表。Time_session table是由session table中的SessionDate组成的第三个表,它为每一天提供一个主键

如何填充绿色事实表中的日期\u 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";

使用以下查询从两个表进行更新:

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;

使用以下查询从两个表进行更新:

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;

Oracle不允许在
update
中加入
join
。可以使用相关子查询:

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

如果所有行都匹配,
存在
可能不是必需的。

Oracle不允许
更新
中加入
。可以使用相关子查询:

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

如果所有行都匹配,
存在
可能不是必需的。

在Oracle中,您可以更新表或可更新表查询,即
更新表名集…
更新(选择…从…)设置…

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_事实记录只生成一行(由于主键和外键,应该这样做)。

在Oracle中,您可以更新表或可更新查询,即
更新表名集…
更新(选择…)集…

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_事实记录只生成一行(由于主键和外键,应该这样做)。

Oracle不允许在
UPDATE
语句中使用连接,但有时可以将这样的语句重写为
MERGE
(您不指定正在使用的Oracle版本,但由于10g,因此可以在匹配时省略
合并
子句,或在不匹配时省略
子句):

希望这有帮助


顺便说一句,在Oracle中混合大小写对象名是一个坏主意,这一点我再强调也不为过。但也许您处理的是遗留数据,没有选择余地。

Oracle不允许在
UPDATE
语句中使用联接,但有时可以将此类语句重写为
MERGE
(您不指定正在使用的Oracle版本,但由于10g,因此可以在匹配时省略
合并
子句,或在不匹配时省略
子句):

希望这有帮助


顺便说一句,Oracle中大小写混合的对象名称是一个坏主意,这一点我再强调也不为过。但也许您处理的是遗留数据,没有选择余地。

谢谢您的回复,为什么会出现此错误?“SQL命令未正确结束”我认为“FROM”之前缺少一些内容.@andrew,检查您的查询,是否缺少任何括号或别名..?您确定这在Oracle中有效吗?我怀疑不允许使用
UPDATE…FROM
。此处的语法:
FROM
不允许出现在Oracle的更新语句中感谢您的答复,为什么我会收到此错误?“SQL命令未正确结束”我想在“FROM”之前少了一些东西.@andrew,检查您的查询,所有括号或别名都丢失了..?您确定这在Oracle中有效吗?我怀疑
UPDATE…FROM
是不允许的。这里的语法:
FROM
不允许出现在Oracle中的UPDATE语句中可能只是一个旁注的重复:您不应该冗余存储数据。但是,也许您要g在更新后从
会话
中删除
会话
日期。可能只是一个旁注的重复:你不应该冗余存储数据。但是,也许你会在更新后从
会话
中删除
会话
日期。Linnof你能帮我做这个吗?它是一样的,但少了一个表你能帮我拿一下这张吗?还是一样,只是少了一张桌子