Sql 如何通过连接其他两个表来更新表
这里有三个表,会话表连接到带有会话id字段的Green_事实表。Time_session table是由session table中的SessionDate组成的第三个表,它为每一天提供一个主键 如何填充绿色事实表中的日期\u ID字段。 下面的代码是我认为应该使用的,但它不能正常工作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
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你能帮我做这个吗?它是一样的,但少了一个表你能帮我拿一下这张吗?还是一样,只是少了一张桌子