如何比对Catalogue表补全Product表缺失记录并更新全列数据
Product表缺失产品补全实现方案
核心需求
对比Catalogue(产品目录表)和Product(产品表),将目录表中存在、但产品表未收录的产品记录完整插入到产品表中,不改动产品表现有记录。
测试用表结构&示例数据
Product表现有数据
ProductID ProductName Quantity 1 A 3 2 B 2 3 C 3
Catalogue表全量数据
CatelogueID ProductID ProductName Quantity 1 3 C 3 2 4 D 1 3 1 A 3 4 6 F 5 5 2 B 1 6 5 E 0
按上述示例数据,最终需要补入Product表的是ProductID为4、5、6的3条产品记录。
实现SQL
通用兼容写法(支持MySQL、SQL Server、PostgreSQL、Oracle等绝大多数主流数据库),通过NOT EXISTS判断产品是否已存在,不存在则插入:
INSERT INTO Product (ProductID, ProductName, Quantity) SELECT c.ProductID, c.ProductName, c.Quantity FROM Catalogue c WHERE NOT EXISTS ( SELECT 1 FROM Product p WHERE p.ProductID = c.ProductID );
其他适配特定场景的写法
- 支持差集语法的数据库(PostgreSQL、SQL Server等),可以用
EXCEPT直接取两表ProductID的差集再关联插入:
INSERT INTO Product (ProductID, ProductName, Quantity) SELECT c.ProductID, c.ProductName, c.Quantity FROM Catalogue c JOIN ( SELECT ProductID FROM Catalogue EXCEPT SELECT ProductID FROM Product ) diff ON c.ProductID = diff.ProductID;
- MySQL环境下也可以用左连接判空的写法,逻辑和NOT EXISTS一致:
INSERT INTO Product (ProductID, ProductName, Quantity) SELECT c.ProductID, c.ProductName, c.Quantity FROM Catalogue c LEFT JOIN Product p ON c.ProductID = p.ProductID WHERE p.ProductID IS NULL;
操作提示:默认用
ProductID作为产品唯一匹配字段,如果业务上是用产品名等其他字段判定重复,调整关联判断的字段即可。正式执行插入前,建议先单独运行SELECT子句部分,确认待插入的数据符合预期,避免误写入。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

