如何合并无共同主键的两张表并创建新表存储结果?
解决方案:将表连接结果存入新表(无共同主键场景)
嘿,其实你已经找对了关联两个表的核心逻辑,只是没意识到完全可以把查询结果直接存入新表——不需要两个表有共同主键,只要有能匹配的关联字段(比如你这里的codeCis)就行。
直接创建新表并填充数据
你原来的select * from foo, goo where foo.codeCIS= goo.codeCIS本质是基于codeCis的内连接,我们可以把这个查询改写成创建新表的语句,不同数据库的写法略有差异:
MySQL/MariaDB 写法
CREATE TABLE new_table AS SELECT foo.codeCis, goo.MedicineName, foo.CIP13, foo.Price FROM foo JOIN goo ON foo.codeCIS = goo.codeCIS;
SQL Server 写法
SELECT foo.codeCis, goo.MedicineName, foo.CIP13, foo.Price INTO new_table FROM foo JOIN goo ON foo.codeCIS = goo.codeCIS;
Oracle 写法
CREATE TABLE new_table AS SELECT foo.codeCis, goo.MedicineName, foo.CIP13, foo.Price FROM foo INNER JOIN goo ON foo.codeCIS = goo.codeCIS;
为什么这个方法可行?
- 你用
foo.codeCIS = goo.codeCIS作为关联条件已经验证过逻辑正确性,能得到你想要的结果 - 显式的
JOIN语法比隐式的逗号连接可读性更强,逻辑完全一致 - 执行后会自动生成
new_table,字段结构和SELECT子句里的字段一一对应,数据也会自动填充
进阶:自定义新表的字段约束
如果你需要给新表添加约束(比如把CIP13设为主键,因为它在foo表里是唯一的),可以先手动创建表,再插入数据:
-- 先创建带约束的新表,根据实际字段类型调整 CREATE TABLE new_table ( codeCis VARCHAR(20), MedicineName VARCHAR(100), CIP13 VARCHAR(20) PRIMARY KEY, -- 利用foo表中CIP13的唯一性设为主键 Price DECIMAL(10, 2) ); -- 插入关联后的数据 INSERT INTO new_table (codeCis, MedicineName, CIP13, Price) SELECT foo.codeCis, goo.MedicineName, foo.CIP13, foo.Price FROM foo JOIN goo ON foo.codeCIS = goo.codeCIS;
这样就能得到和你预期完全一致的新表啦!
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

