在資通電腦 MIS 委外服務經驗中,曾遇到在製作報表資料時,需在新舊混合資料中,取出其對應日期的相關資料的問題。初期開發時,查詢資料會遇到「資料欄位」需要到其他資料表取值,因此採以 JOIN 方式處理資料。
![以 JOIN 方式抓取其他資料表的數值](https://marketing.ares.com.tw/images/2020-09/it_1.jpg)
但時常會出現同一筆資料對應多筆資料的情況,需以某一指定欄位進行排序後來取得資料,所以轉為以子查詢方式來處理資料。
![以子查詢方式處理資料](https://marketing.ares.com.tw/images/2020-09/it_2.jpg)
因為報表資料都為排序後的單欄位對應顯示多個相關欄位資料,需要多次使用子查詢功能,加上是對同一資料表多次取值,於是改為先排序再進行 JOIN 來取得資料,這時偶爾會發生資料對應錯誤的情況。
![透過排序再 JOIN 取得資料,偶爾會發生資料對應錯誤](https://marketing.ares.com.tw/images/2020-09/it_3.jpg)
先排序再進行 JOIN 的方式會出現問題的原因是在排序,因為排序是對整個資料表來進行,而不是針對某一條件進行,當 JOIN 條件越少而排序條件越多時,錯誤發生的機率就會跟上升。
於是改採用 Microsoft SQL Server 2005 之後版本提供的新功能 APPLY,因為 APPLY 是先進行條件篩選後再排序,就可順利解決上述問題。
![APPLY 先條件篩選後再排序](https://marketing.ares.com.tw/images/2020-09/it_4.jpg)
APPLY 語法簡易說明
- OUTER APPLY:篩選過後不一定會有資料,若查無資料則該組資料繼續顯示且對應的相關欄位皆為 NULL,類似 LEFT JOIN。
- CROSS APPLY:篩選過後一定會有資料,若查無資料則該組資料不顯示,類似 INNER JOIN。
- APPLY 語法可以直接與資料表函數對接資料。
![APPLY 與資料表函數對接](https://marketing.ares.com.tw/images/2020-09/it_5.jpg)
資通 MIS 委外服務具備豐富經驗與解決方法的應變能力,能協助企業解決在資訊工程上的大小問題。您也遇過上述 SQL 技術難題嗎?交給資通 MIS 委外服務!