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

Oracle 中將查詢結果插入另一張表的正確 SQL 寫法

     編輯:程式設計綜合問答

問題場景

需將 SELECT COUNT(*) FROM test3 的統計結果(如 8 條)插入到另一張表 sum_table 中。嘗試使用 INSERT INTO sum_table SELECT COUNT(*) FROM test3 但發現插入的值為 1 而非 8。

錯誤原因

INSERT INTO table SELECT ... 語法要求 SELECT 列表的列數、類型與目標表結構完全匹配。若目標表 sum_table 有多列(如 id, cnt, create_time),而 SELECT 僅返回一列聚合值,數據庫可能隱式插入默認值或報錯,導致結果不符預期。題主描述「插入的是 1」可能是因為目標表有自增 ID 列,實際統計值未正確寫入目標列。

標準寫法

顯式指定目標列名,確保一一對應:

-- 假設 sum_table 結構:id (PK), total_count (NUMBER), stat_date (DATE)
INSERT INTO sum_table (total_count, stat_date)
SELECT COUNT(*), SYSDATE FROM test3;

進階用法

1. 多表聯查統計後插入

INSERT INTO dept_salary_summary (dept_id, avg_sal, emp_cnt)
SELECT d.dept_id, AVG(e.sal), COUNT(*)
FROM emp e JOIN dept d ON e.dept_id = d.dept_id
GROUP BY d.dept_id;

2. 條件插入

INSERT INTO high_salary_emps (emp_id, sal)
SELECT emp_id, sal FROM emp WHERE sal > 5000;

3. Merge Into (Upsert)

若需「存在則更新,不存在則插入」:

MERGE INTO sum_table t
USING (SELECT COUNT(*) AS cnt FROM test3) s
ON (t.stat_date = TRUNC(SYSDATE))
WHEN MATCHED THEN UPDATE SET t.total_count = s.cnt
WHEN NOT MATCHED THEN INSERT (stat_date, total_count) VALUES (TRUNC(SYSDATE), s.cnt);

最佳實踐

  • 永遠顯式列出 INSERT INTO table (col1, col2...) 目標列,避免表結構變更導致錯誤。
  • SELECT 列表順序、類型與目標列嚴格對應。
  • 大批量數據插入時考慮 /*+ APPEND */ 提示或 BULK COLLECT 提升性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved