如何将4个表的数据插入含外键的OBSERVATION表?
嘿,这个多表合并插入的需求我熟!咱们一步步来搞定它:
核心思路
要把4个含ID的源表数据插入到OBSERVATION表,关键是通过关联外键表获取对应的OL_ID、BP_ID、OC_ID,再用UNION ALL把4个源表的结果合并起来一次性插入。
前提确认
先明确两个关键点,这样写出来的语句才精准:
- 每个源表的哪些字段对应
OBSERVATION的NAME?以及它们和外键表(OPERATING_LOCATION_1、BUSINESS_PROCESS、OBSERVATION_CATEGORY)的关联字段是什么?(比如通常是通过NAME字段匹配,下面示例就按这个来) O_ID是自增列还是从源表的ID直接复用?(示例里两种情况都给说明)
完整SQL示例
假设4个源表分别叫TableA、TableB、TableC、TableD,每个都有ID和NAME,还有关联外键表的字段(比如LOCATION_NAME、PROCESS_NAME、CATEGORY_NAME):
INSERT INTO OBSERVATION (O_ID, NAME, OL_ID, BP_ID, OC_ID) -- 从TableA提取数据 SELECT ta.ID AS O_ID, -- 若O_ID是自增列,这里换成DEFAULT或者去掉该列(INSERT列表也要去掉) ta.NAME, ol.ID AS OL_ID, bp.BP_ID, oc.OC_ID FROM TableA ta -- 关联外键表获取对应ID INNER JOIN OPERATING_LOCATION_1 ol ON ta.LOCATION_NAME = ol.NAME INNER JOIN BUSINESS_PROCESS bp ON ta.PROCESS_NAME = bp.NAME INNER JOIN OBSERVATION_CATEGORY oc ON ta.CATEGORY_NAME = oc.NAME UNION ALL -- 用UNION ALL保留所有数据,若要去重换成UNION -- 从TableB提取数据,逻辑和TableA一致 SELECT tb.ID AS O_ID, tb.NAME, ol.ID AS OL_ID, bp.BP_ID, oc.OC_ID FROM TableB tb INNER JOIN OPERATING_LOCATION_1 ol ON tb.LOCATION_NAME = ol.NAME INNER JOIN BUSINESS_PROCESS bp ON tb.PROCESS_NAME = bp.NAME INNER JOIN OBSERVATION_CATEGORY oc ON tb.CATEGORY_NAME = oc.NAME UNION ALL -- TableC SELECT tc.ID AS O_ID, tc.NAME, ol.ID AS OL_ID, bp.BP_ID, oc.OC_ID FROM TableC tc INNER JOIN OPERATING_LOCATION_1 ol ON tc.LOCATION_NAME = ol.NAME INNER JOIN BUSINESS_PROCESS bp ON tc.PROCESS_NAME = bp.NAME INNER JOIN OBSERVATION_CATEGORY oc ON tc.CATEGORY_NAME = oc.NAME UNION ALL -- TableD SELECT td.ID AS O_ID, td.NAME, ol.ID AS OL_ID, bp.BP_ID, oc.OC_ID FROM TableD td INNER JOIN OPERATING_LOCATION_1 ol ON td.LOCATION_NAME = ol.NAME INNER JOIN BUSINESS_PROCESS bp ON td.PROCESS_NAME = bp.NAME INNER JOIN OBSERVATION_CATEGORY oc ON td.CATEGORY_NAME = oc.NAME;
关键注意事项
- 外键匹配问题:如果源表中存在外键表没有的记录,用
INNER JOIN会丢失这些数据,此时可以换成LEFT JOIN,但要确保OBSERVATION的外键字段允许NULL。 - O_ID自增处理:如果
O_ID是自增列(比如MySQL的AUTO_INCREMENT、PostgreSQL的SERIAL),可以直接去掉O_ID的插入列和SELECT语句中的对应部分,数据库会自动生成值。 - 数据重复:如果4个源表可能存在重复的
O_ID,根据业务需求选择:UNION ALL保留所有重复,UNION自动去重(但性能稍差)。 - 关联字段唯一性:如果外键表的
NAME字段不唯一,建议改用唯一键(比如主键)来关联,避免匹配到错误的ID。
内容的提问来源于stack exchange,提问作者Charchita Washimkar
相关产品推荐
相关产品推荐

