表 tableA 有欄位 bid 關聯 tableB,但 tableA.bid 可能指向不存在的 tableB 記錄。需求:若 bid 在 tableB 不存在,則自動取 tableB 中 aid = tableA.aid 的最新記錄(最大 bid)作為替代,再進行關聯查詢。
先執行更新,將無效 bid 替換為最新有效 bid:
UPDATE tableA
SET bid = (
SELECT MAX(bid) FROM tableB WHERE aid = tableA.aid
)
WHERE bid NOT IN (SELECT bid FROM tableB);
再執行原查詢:
SELECT tableA.no, tableA.total, tableB.s1, tableB.s2
FROM tableA
INNER JOIN tableB ON tableA.bid = tableB.bid;
SQL Server 2008+ 可用 MERGE 或 CTE 合併邏輯,避免兩次掃描:
WITH ValidB AS (
SELECT aid, MAX(bid) AS bid FROM tableB GROUP BY aid
)
SELECT a.no, a.total, b.s1, b.s2
FROM tableA a
LEFT JOIN tableB b ON a.bid = b.bid
LEFT JOIN ValidB v ON a.aid = v.aid
CROSS APPLY (
SELECT * FROM tableB WHERE bid = COALESCE(b.bid, v.bid)
) b2;
COALESCE/OUTER APPLY 在查詢層面處理。tableB.bid 有索引,aid 也建立索引以加速子查詢。