天天看點

分子

    每位SQL Server開發員都有自己的首選操作方法。我的方法叫做分子查詢。這些是由原子查詢組合起來的查詢,通過它們我可以處理一個表格。将原子組合起來,可以建立分子。當然也會有限制(化學家所稱的化合價),但一般來說,這個原理還是适用的。

在本文中,我将探讨這種政策的幾種變化。我從最基本的内容開始(即最詳細的内容),然後逐漸深化。為讓你了解這種方法的靈活性,我會在不同層次使用幾種技巧。(

警告

:這并不是唯一的解決方法,我隻是在讨論一些可行的選擇。)

我從普遍使用的資料庫Northwind開始(雖然為了保留原貌,我把它複制到Northwind_New中,實際這才是我使用的資料庫。)在我的拷貝中,我做出這些重要的修改。

我删除了複合主鍵,增加一個叫做PK的新列,并将其設為Identity列。

我增加了一個稱作ExtendedAmount的計算列。

清單A中包含建立這個新表格的建立(Create)語句。我用這個指令将它和值從原始表格中迅速移植出來:

INSERT INTO [Northwind_New].[dbo].[OrderDetails_New]

SELECT * FROM [Northwind_New].[dbo].[Order Details]

既然我有一個多行的表格,是時候開始實驗了。(一旦新列ExtendedAmount被計算,其值會自動移植。)最初,我想用OrderID計算ExtendedAmount列的總數。我建立一個視圖,如清單B所示。

我每行得到一個OrderID,ExtendedAmount的列數得到總計。(稱之為OrderAmount,将航運,稅收等相加得到OrderTotal)。

我會在等式中引入一個表格UDF,如清單C所示。注意,我可以用兩種方法調用函數:送出CustomerID将表格限定為那個顧客的訂單,或送出一個NULL獲得所有顧客訂單清單。如果我送出CustomerID,那麼訂單清單就出現在OrderDate中;如果我送出NULL,清單就被分組并在CustomerID中由OrderDate排序。

更深入一步,我每個顧客列印一行,用一列顯示每名顧客的總銷售額。檢視清單D。并不是所有項目都得到組合。在最外層,我能夠以兩種方式調用這個函數:提×××法CustomerID或UNLL。以下是它們各自的執行個體:

SELECT CustomerID, CustomerTotal

FROM DBO.CustomerGrandTotal_fnt(null)

FROM DBO.CustomerGrandTotal_fnt('VINET')

現在你有了一組精确的工具來幫助你挖掘适當層次的細節。計算列OrderDetails.ExtendedAmount隐藏了一個複雜層次,從那我又深入到我希望隐藏的細節。這就是我把這些對象叫做原子和分子查詢的原因。我使用“查詢”一詞來概括這樣一個事實,即讨論的對象是視圖還是表格UDF并不重要。(雖然由于命名規則,suffix _fnt表示一個表格UDF,而suffix _vue表示一個視圖。)

必須承認,Northwind資料庫中沒有大量的行,但我認為這種技巧可以得到很好地擴充。更為重要的是,我喜歡它提供的粒度。我能夠做我想做的,并按要求重新使用或重新組合原子。