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

Access LEFT JOIN 查詢無結果:ON 條件格式化函數 FORMAT 導致類型不匹配

     編輯:程式設計綜合問答

問題現象

  • 單獨查詢兩個子查詢 (DT、AA) 均有數據。
  • `LEFT JOIN ... ON DT.時間 = AA.時間 AND DT.車牌號 = AA.車牌號` 返回**全為 0 的燃油費** (即 JOIN 未匹配)。
  • 放寬條件 `ON DT.時間 = AA.時間` 或 `ON DT.車牌號 = AA.車牌號` 單獨可匹配。

根本原因

Access 中 `FORMAT` 函數返回類型為 `Text` (字符串),但兩側格式化細節不一致導致字符串不相等。**

  • DT 表:`FORMAT(DATEADD('m', BS.NUM, begin), 'yyyy年MM月')` → 如 `"2015年01月"`
  • AA 表:`FORMAT(A.交易時間, 'yyyy年MM月')` → 理應相同,但 Access 內部可能產生隱藏字符、空格、或日期時間組件差異。

解決方案:雙側統一二次格式化


-- 修改 ON 條件
ON DT.時間 = FORMAT(AA.時間, 'yyyy年MM月') AND DT.車牌號 = AA.車牌號
--           ↑ 強制 AA 端也用 FORMAT 轉為完全一致的字符串

**原理**:雖然 AA 子查詢中已用 `FORMAT`,但在 JOIN 時再次顯式 `FORMAT` 強制類型轉換與格式統一,消除隱式差異。

Access SQL 避坑指南

坑點現象對策
日期字面值`#2023-01-01#` 非 `'2023-01-01'`始終用 `#日期#`
FORMAT 返回類型返回 Text,非 Date/Time比較時雙側同用 FORMAT,或用 DateDiff/Year/Month 函數
IIF vs NZ`IIF(ISNULL(x),0,x)` → `NZ(x,0)` 更簡潔優先用 NZ
參數查詢參數名與字段名衝突參數加前綴 `p_`,如 `p_begin`
保留字`時間`、`日期`、`名稱` 等需加 `[]`字段名盡量避開保留字

優化建議:避免子查詢重複計算


-- 使用臨時表或 CTE (Access 不支持 CTE,可建立查詢對象)
-- 1. 建立查詢 qry_DT: 選擇時間、車牌號
-- 2. 建立查詢 qry_AA: 選擇時間、車牌號、燃油費
-- 3. 主查詢 JOIN qry_DT 和 qry_AA
-- 界面操作更直觀,性能更好,易維護

驗證步驟

  1. 分別運行 DT、AA 子查詢,複製幾行 `時間` 字段到文本編輯器,**顯示不可見字符** (Notepad++ `View → Show Symbol → Show All Characters`),對比長度、空格、換行。
  2. 在 JOIN 查詢中添加 `DT.時間, AA.時間` 到 SELECT 列表,直觀對比兩側值。
  3. 應用雙側 `FORMAT` 後再次驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved