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

SQL Server 條件查詢:主表關聯不存在時自動取關聯表最新記錄替代

     編輯:程式設計綜合問答

業務場景

表 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;

進階:單條語句完成(CTE / MERGE)

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 也建立索引以加速子查詢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved