表 A 以複合主鍵關聯表 B。需篩選:A.日期 > B.日期最大值;若 B 無對應資料,則 A.日期 < B.日期最小值(或視為無資料處理)。
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));
MAX 與 MIN 日期。LEFT JOIN 保留 A 所有列,無對應 B 時 b.max_date 為 NULL。WHERE 分兩種情況:
a_date > max_datea_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,該列被過濾(符合「沒有情況下不比較」語意)。
(pk1, pk2, b_date) 建立複合索引。MAX(b_date) OVER (PARTITION BY pk1, pk2) 避免重複掃描。