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

Oracle SQL:主鍵關聯下的日期比較邏輯

     編輯:程式設計疑難解答

需求描述

表 A 以複合主鍵關聯表 B。需篩選:A.日期 > B.日期最大值;若 B 無對應資料,則 A.日期 < B.日期最小值(或視為無資料處理)。

SQL 實作

SELECT a.*
FROM A a
LEFT JOIN (
    SELECT pk1, pk2, MAX(b_date) AS max_date, MIN(b_date) AS min_date
    FROM B
    GROUP BY pk1, pk2
) b ON a.pk1 = b.pk1 AND a.pk2 = b.pk2
WHERE (b.max_date IS NOT NULL AND a.a_date > b.max_date)
   OR (b.max_date IS NULL AND a.a_date < (SELECT MIN(b_date) FROM B WHERE pk1 = a.pk1 AND pk2 = a.pk2));

邏輯拆解

  1. 子查詢計算 B 表每組主鍵的 MAX 與 MIN 日期。
  2. LEFT JOIN 保留 A 所有列,無對應 B 時 b.max_date 為 NULL。
  3. WHERE 分兩種情況:
    • 有 B 資料:a_date > max_date
    • 無 B 資料:a_date < (該鍵值在 B 的 MIN 日期),若 B 完全無此鍵值則子查詢回傳 NULL,條件不成立(可視為不篩選或依業務調整)。

簡化版(僅「大於最大值」)

SELECT * FROM A a
WHERE a.a_date > (SELECT MAX(b_date) FROM B b WHERE b.pk1 = a.pk1 AND b.pk2 = a.pk2);

若 B 無對應資料,子查詢回傳 NULL,a_date > NULL 判定為 UNKNOWN,該列被過濾(符合「沒有情況下不比較」語意)。

效能建議

  • 在 B 表 (pk1, pk2, b_date) 建立複合索引。
  • 大資料量考慮分析函式 MAX(b_date) OVER (PARTITION BY pk1, pk2) 避免重複掃描。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved