2012年12月25日 星期二

一秒看破 T-SQL 強大的 ISNULL() 函數

查詢最怕的就是沒法一次查出來

分幾次查 再用C# 乾坤大挪移 是個以快打快的大絕招

但是理想代碼的世界 這麼做是不好的 因為違背 SOC原則

在資料查詢層 進行了邏輯的演算 這還不包括 有可能加入一些排版的語法

如果所以必須練就出一擊斃殺式的 TSQL查詢 才能夠切的乾淨





然後是最近有人問我的一個查詢

需求如下

有兩張表 一張是訂單清單 一張是成本報價清單

兩者跟產品的關係是多對多

目的是給訂單標上成本

條件是 訂單日期 如果有 相符月份的報價 則填該日期報價

否則標最新的一個日期的報價



一開始我還不明題意的時候 直覺用 CASE 來搞 後來發現兩張表是多對多關係 CASE 不起來

最後的解法是依靠 我的愛將 ISNULL() 函數 來做子查詢


SELECT B.[PID],B.[Name],B.[Date],
ISNULL(
    (
        SELECT C.[Cost] From CostTable AS C
        WHERE B.[PID] = C.[PID]
        AND B.[Date] = C.[Date]
    ),
    (
        SELECT TOP 1 C.[Cost] From CostTable AS C
        WHERE B.[PID] = C.[PID]
        ORDER BY C.[Date] DESC
    )
) AS 'COST'
FROM BillTable AS B

aaa 跟 bbb 都有相符的報價 所以顯示對應的報價

ccc 兩筆 都無相符的報價 所以顯示最後的報價

沒有留言:

張貼留言