合并 SQL 多个插入语句不是一个选项
Posted
技术标签:
【中文标题】合并 SQL 多个插入语句不是一个选项【英文标题】:Merge SQL multiple insert statement is not an option 【发布时间】:2013-01-22 10:05:35 【问题描述】:那么,继续另一个问题……
我已经合并,哪个任务是从只能表示实体之间的 1-1 连接 (PROJECT) 的现有表和可以表示 N-1 连接 (worker) 的表创建联结表行,联结表是(PROJECT-WORKER),每个项目都应该有一个专门的领导,每个工人都应该有一个项目,但现在我应该有一个 n-n 连接......这个合并可以完成这项工作:
但不幸的是,multiple matched then insert
分支不是 sql 中的“功能”,我该如何解决这个问题。原始查询---)
MERGE INTO WORKERPROJECT TARGET
USING (SELECT distinct
w.worker_id,
w.worker_type,
w.project_id worker_project_id,
p.project_id project_project_id,
p.dedicated_project_leader,
p.dedicated_lead_developer,
p.dedicated_lead_consultant,
p.dedicated_supervisor
from WORKER w
join PROJECT p on w.project_id = p.project_id
) SOURCE
ON (SOURCE.worker_type is null)
WHEN NOT MATCHED THEN INSERT (TARGET.FK_WORKER_ID, TARGET.FK_PROJECT_ID,TARGET.IS_ACTIVE,POSITION)
VALUES (SOURCE.WORKER_ID,SOURCE.worker_project_id,'ACTIVE',SOURCE.worker_type);
WHEN NOT MATCHED THEN INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION)
VALUES (SOURCE.dedicated_project_leader,SOURCE.project_project_id,'ACTIVE','PROJECTVEZETŐ');
WHEN NOT MATCHED THEN INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION)
INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION) VALUES (SOURCE.dedicated_lead_developer,SOURCE.project_project_id,'ACTIVE','FEJLESZTŐVEZETŐ');
WHEN NOT MATCHED THEN INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION)
INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION) VALUES (SOURCE.dedicated_lead_consultant,SOURCE.project_project_id,'ACTIVE','KONZULENSVEZETŐ');
WHEN NOT MATCHED THEN INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION)
INSERT (FK_WORKER_ID, FK_PROJECT_ID,IS_ACTIVE,POSITION) VALUES (SOURCE.dedicated_supervisor,SOURCE.project_project_id,'ACTIVE','SUPERVISOR');
【问题讨论】:
【参考方案1】:其实你可以。感谢insert all
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2095116
【讨论】:
如果这是真的,你让我很开心(y) 好吧,我想你下午可以休息了。 ;) 更严重的是,每次使用 Oracle 时,您都会认为“这是常见问题,可能很多人都遇到过”。然后,它已经开箱即用。或者,有一个非常容易找到且有据可查的解决方法(如标识列) 是的,应该可以,但是没找到:/反正我感觉insert all不能用在merge语句中:( @czupe - 你不能将insert all
与merge
结合起来,但是在这种情况下你不需要 - 你实际上并没有更新workerproject 表。将您的 merge
替换为 insert all
从 worker
中的选择驱动
好吧,好吧,我被卖了,我会接受的……但说真的,这只是为了我的培训问题,我找不到更好的例子来表示“如果我需要多个插入怎么办我的合并声明”【参考方案2】:
如果您需要使用合并执行多个插入,则将不同表中的列添加到初始选择中。像这样:
`MERGE INTO regional_dummy a
USING (SELECT c.ID as IDNO FROM region_country c WHERE c.parent_id = '2' ) b
ON ('true' = 'false')
--WHEN MATCHED THEN UPDATE <TODO>
WHEN NOT MATCHED THEN
INSERT
(id,REGIONAL_userid,REGIONAL_NAME,REGIONAL_EMAIL,CREATE_DATE,CREATED_BY,REGION_ID, COUNTRY_ID,PRODUCT_ID,ACTIVE,REPLACE_FLAG0)
VALUES (REGIONAL_SEQ.nextval,'12345rg','userName','userEmailId',sysdate, 'rgrover0','2',b.IDNO,'m_product_region','Y' ,'N');`
【讨论】:
你可以通过编辑代码来改进这个答案,这样它的格式就可以很好地显示出来,将它们全部放在一行中会很难阅读以上是关于合并 SQL 多个插入语句不是一个选项的主要内容,如果未能解决你的问题,请参考以下文章
在一个 Power Query 中合并多个工作簿中的相同选项卡