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

Oracle SQL:含聚合函數的左外連接報「非 GROUP BY 表達式」錯誤解決

     編輯:程式設計綜合問答

錯誤原因

查詢中使用 MAX(t281.uriage_denpyou_no) 等聚合函數,但 GROUP BY 子句僅包含 t281.seikyuusho_no,SELECT 清單中的其他非聚合欄位(如 CASE WHEN COUNT(...) ... END)未出現在 GROUP BY 中,違反 SQL 標準。

修正原則

  1. 所有非聚合欄位必須在 GROUP BY 中,或包裹在聚合函數內。
  2. 或改用子查詢/分析函數計算聚合後再連接。

修正範例(針對片段)

-- 原片段
SELECT t281.seikyuusho_no,
       MAX(t281.uriage_denpyou_no) AS uriageDenpyouNo,
       CASE WHEN COUNT(t281.uriage_denpyou_no) >= 2 THEN '1' ELSE '0' END AS uriageShuseiFg
FROM t_tokuisaki_seikyuu_uriage t281
WHERE t281.delete_fg = '0'
GROUP BY t281.seikyuusho_no;  -- 只分組 seikyuusho_no

-- 修正:CASE 表達式依賴 COUNT,COUNT 是聚合,結果可直接用,但嚴格模式下需確認
-- Oracle 允許 SELECT 中出現聚合函數的運算,但建議將 CASE 包在聚合外層或改用窗口函數
SELECT seikyuusho_no,
       MAX(uriage_denpyou_no) AS uriageDenpyouNo,
       CASE WHEN COUNT(uriage_denpyou_no) >= 2 THEN '1' ELSE '0' END AS uriageShuseiFg
FROM t_tokuisaki_seikyuu_uriage
WHERE delete_fg = '0'
GROUP BY seikyuusho_no;

完整大查詢建議

將大 SQL 拆解為多個 CTE (WITH 子句),逐步驗證每個子查詢的 GROUP BY 正確性,再組合。避免單層超長 SQL 導致維護困難。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved