通過SQL Server原子來建立分子查詢實(shí)操
以下的文章主要是介紹如何正確通過SQL Server原子來建立分子查詢的實(shí)際操作過程,我們大家都知道每位SQL Server數(shù)據(jù)庫的開發(fā)員都有自己獨(dú)特的首選操作方法。我的方法叫做分子查詢。
這些是由SQL Server原子查詢組合起來的查詢,通過它們我可以處理一個表格。將原子組合起來,可以建立分子。當(dāng)然也會有限制(化學(xué)家所稱的化合價),但一般來說,這個原理還是適用的。
在本文中,我將探討這種策略的幾種變化。我從最基本的內(nèi)容開始(即最詳細(xì)的內(nèi)容),然后逐步深化。為讓你了解這種方法的靈活性,我會在不同層次使用幾種技巧。(警告:這并不是唯一的解決方法,我只是在討論一些可行的選擇。)
我從普遍使用的SQL Server數(shù)據(jù)庫Northwind開始(雖然為了保留原貌,我把它復(fù)制到Northwind_New中,實(shí)際這才是我使用的SQL Server數(shù)據(jù)庫。)在我的拷貝中,我做出這些重要的修改。
我刪除了復(fù)合主鍵,增加一個叫做PK的新列,并將其設(shè)為Identity列。
我增加了一個稱作ExtendedAmount的計(jì)算列。
- USE [Northwind_New] GO /****** Object: Table [dbo].[OrderDetails_New] Script Date: 08/23/2006 16:15:42 ******/ SET ANSI_NULLS>
清單A
清單A中包含SQL Server原子建立這個新表格的新建(Create)語句。我用這個命令將它和值從原始表格中迅速移植出來:
- INSERT INTO [Northwind_New].[dbo].[OrderDetails_New] SELECT * FROM [Northwind_New].[dbo].[Order Details]
既然我有一個多行的表格,是時候開始實(shí)驗(yàn)了。(一旦新列ExtendedAmount被計(jì)算,其值會自動移植。)最初,我想用OrderID計(jì)算ExtendedAmount列的總數(shù)。我建立一個視圖,如清單B所示。
- USE [Northwind_New] GO /****** Object:?View [dbo]. [OrderDetailsSumByOrderID_vue]Script Date: 08/23/2006 16:31:18 ******/ SET ANSI_NULLS>
清單B
我每行得到一個OrderID,ExtendedAmount的列數(shù)得到總計(jì)。(稱之為OrderAmount,將航運(yùn),稅收等相加得到OrderTotal)。
我會在等式中引入一個表格UDF,如清單C所示。注意,我可以用兩種方法調(diào)用函數(shù):提交CustomerID將表格限定為那個顧客的訂單,或提交一個NULL獲得所有顧客訂單清單。如果我提交CustomerID,那么訂單清單就出現(xiàn)在OrderDate中;如果我提交NULL,清單就被分組并在CustomerID中由OrderDate排序。
- set ANSI_NULLS>
清單C
- -- ================================================ --
- Template generated from Template Explorer using: -- Create Inline Function (New Menu).
- SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter
- -- values below. -- -- This block of comments will not be included in -- the definition of the function.
- -- ================================================ SET ANSI_NULLS>
清單D
更深入一步,我每個顧客打印一行,用一列顯示每名顧客的總銷售額。查看清單D。并不是所有項(xiàng)目都得到組合。在最外層,我能夠以兩種方式調(diào)用這個函數(shù):提交合法CustomerID或UNLL以下是它們各自的實(shí)例:
- SELECT CustomerID, CustomerTotal FROM DBO.CustomerGrandTotal_fnt(null) SELECT CustomerID, CustomerTotal FROM DBO.CustomerGrandTotal_fnt('VINET')
現(xiàn)在你有了一組精確的工具來幫助你挖掘適當(dāng)層次的細(xì)節(jié)。計(jì)算列OrderDetails.ExtendedAmount隱藏了一個復(fù)雜層次,從那我又深入到我希望隱藏的細(xì)節(jié)。這就是我把這些對象叫做SQL Server原子和分子查詢的原因。我使用“查詢”一詞來概括這樣一個事實(shí),即討論的對象是視圖還是表格UDF并不重要。(雖然由于命名規(guī)則,suffix _fnt表示一個表格UDF,而suffix _vue表示一個視圖。)
必須承認(rèn),Northwind數(shù)據(jù)庫中沒有大量的行,但我認(rèn)為這種技巧可以得到很好地擴(kuò)充。更為重要的是,我喜歡它提供的粒度。我能夠做我想做的,并按要求重新使用或重新組合SQL Server原子。
【編輯推薦】
- SQL Server 2005 數(shù)據(jù)庫鏡像的運(yùn)行方式
- 產(chǎn)生SQL Server死鎖的原因與破解
- SQL Server備份文件中對現(xiàn)存數(shù)據(jù)庫的導(dǎo)入
- 改善SQL Server安全規(guī)劃的6步驟
- SQL Server 2000文件損壞的修復(fù)方案