首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 不同結構表合併:INSERT INTO ... SELECT 配合 NOT IN 避免重複

     編輯:程式設計綜合問答

表結構

Table A: no (PK), name, status
Table B: no (PK), name

需求

將 B 表中 **A 表不存在的 no** 記錄插入 A 表,status 固定為 'Add'。

錯誤寫法

INSERT INTO A(no,name,status) VALUES (SELECT no,name,'Add' FROM B WHERE B.no NOT IN (SELECT no FROM A))
-- 語法錯誤:VALUES 後不能接 SELECT

正確寫法

INSERT INTO A (no, name, status)
SELECT no, name, 'Add'
FROM B
WHERE B.no NOT IN (SELECT no FROM A);
  • **INSERT INTO ... SELECT** 是標準 SQL,直接將查詢結果集寫入目標表。
  • 欄位順序、數量、型別必須一一對應。

效能優化:NOT EXISTS 取代 NOT IN

INSERT INTO A (no, name, status)
SELECT b.no, b.name, 'Add'
FROM B b
WHERE NOT EXISTS (SELECT 1 FROM A a WHERE a.no = b.no);

NOT EXISTS 在 B 表大、A 表有索引時通常更快,且正確處理 NULL 值 (若 no 允許 NULL,NOT IN 會誤判)。

進階:MERGE (UPSERT) 語法 (SQL Server / Oracle / PostgreSQL)

MERGE INTO A USING B
ON (A.no = B.no)
WHEN NOT MATCHED THEN
    INSERT (no, name, status) VALUES (B.no, B.name, 'Add');

單一陳述式完成「存在則更新、不存在則插入」,避免競爭條件。

MySQL 替代:INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO A (no, name, status)
SELECT no, name, 'Add' FROM B
ON DUPLICATE KEY UPDATE name = VALUES(name), status = 'Update';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved