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

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

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

先排序再進行 JOIN 的方式會出現問題的原因是在排序,因為排序是對整個資料表來進行,而不是針對某一條件進行,當 JOIN 條件越少而排序條件越多時,錯誤發生的機率就會跟上升。
於是改採用 Microsoft SQL Server 2005 之後版本提供的新功能 APPLY,因為 APPLY 是先進行條件篩選後再排序,就可順利解決上述問題。

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

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