技術交流

SQL 技術 APPLY 語法解決新舊資料表對應問題

在資通電腦 MIS 委外服務經驗中,曾遇到在製作報表資料時,需在新舊混合資料中,取出其對應日期的相關資料的問題。初期開發時,查詢資料會遇到「資料欄位」需要到其他資料表取值,因此採以 JOIN 方式處理資料。

以 JOIN 方式抓取其他資料表的數值
以 JOIN 方式抓取其他資料表的數值

但時常會出現同一筆資料對應多筆資料的情況,需以某一指定欄位進行排序後來取得資料,所以轉為以子查詢方式來處理資料。

以子查詢方式處理資料
以子查詢方式進行資料處理

因為報表資料都為排序後的單欄位對應顯示多個相關欄位資料,需要多次使用子查詢功能,加上是對同一資料表多次取值,於是改為先排序再進行 JOIN 來取得資料,這時偶爾會發生資料對應錯誤的情況。

透過排序再 JOIN 取得資料,偶爾會發生資料對應錯誤
透過排序再進行 JOIN 取得資料,偶爾會發生資料對應錯誤

先排序再進行 JOIN 的方式會出現問題的原因是在排序,因為排序是對整個資料表來進行,而不是針對某一條件進行,當 JOIN 條件越少而排序條件越多時,錯誤發生的機率就會跟上升。

於是改採用 Microsoft SQL Server 2005 之後版本提供的新功能 APPLY,因為 APPLY 是先進行條件篩選後再排序,就可順利解決上述問題。

APPLY 先條件篩選後再排序
APPLY 先進行條件篩選後再排序

APPLY 語法簡易說明

  • OUTER APPLY:篩選過後不一定會有資料,若查無資料則該組資料繼續顯示且對應的相關欄位皆為 NULL,類似 LEFT JOIN。
  • CROSS APPLY:篩選過後一定會有資料,若查無資料則該組資料不顯示,類似 INNER JOIN。
  • APPLY 語法可以直接與資料表函數對接資料。
APPLY 與資料表函數對接
APPLY 語法可直接與資料表函數對接資料

資通 MIS 委外服務具備豐富經驗與解決方法的應變能力,能協助企業解決在資訊工程上的大小問題。您也遇過上述 SQL 技術難題嗎?交給資通 MIS 委外服務!

閱讀更多