IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類(lèi)|軟件專(zhuān)題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MSSQL → 如何在SQL Server中由原子建立分子查詢

如何在SQL Server中由原子建立分子查詢

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

每位SQL Server開(kāi)發(fā)員都有自己的首選操作方法。我的方法叫做分子查詢。這些是由原子查詢組合起來(lái)的查詢,通過(guò)它們我可以處理一個(gè)表格。將原子組合起來(lái),可以建立分子。當(dāng)然也會(huì)有限制(化學(xué)家所稱(chēng)的化合價(jià)),但一般來(lái)說(shuō),這個(gè)原理還是適用的。

在本文中,我將探討這種策略的幾種變化。我從最基本的內(nèi)容開(kāi)始(即最詳細(xì)的內(nèi)容),然后逐步深化。為讓你了解這種方法的靈活性,我會(huì)在不同層次使用幾種技巧。(警告:這并不是唯一的解決方法,我只是在討論一些可行的選擇。)

我從普遍使用的數(shù)據(jù)庫(kù)Northwind開(kāi)始(雖然為了保留原貌,我把它復(fù)制到Northwind_New中,實(shí)際這才是我使用的數(shù)據(jù)庫(kù)。)在我的拷貝中,我做出這些重要的修改。

我刪除了復(fù)合主鍵,增加一個(gè)叫做PK的新列,并將其設(shè)為Identity列。

我增加了一個(gè)稱(chēng)作ExtendedAmount的計(jì)算列。

以下為引用的內(nèi)容:

USE [Northwind_New]
GO
/****** Object: Table [dbo].[OrderDetails_New]
Script Date: 08/23/2006 16:15:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATETABLE [dbo].[OrderDetails_New](
[OrderDetailID] [int] IDENTITY(1,1)NOTNULL,
[OrderID] [int] NOTNULL,
[ProductID] [int] NOTNULL,
[UnitPrice] [money] NOTNULL,
[Quantity] [smallint] NOTNULL,
[Discount] [real] NOTNULL,
[ExtendedAmount] AS([Quantity] * [UnitPrice] *(1 - [Discount])),
CONSTRAINT [PK_OrderDetails_New] PRIMARYKEYCLUSTERED
(
[OrderDetailID] ASC
)ON [PRIMARY]
)ON [PRIMARY]

列表A

列表A中包含建立這個(gè)新表格的新建(Create)語(yǔ)句。我用這個(gè)命令將它和值從原始表格中迅速移植出來(lái):

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

SELECT * FROM [Northwind_New].[dbo].[Order Details]
?
既然我有一個(gè)多行的表格,是時(shí)候開(kāi)始實(shí)驗(yàn)了。(一旦新列ExtendedAmount被計(jì)算,其值會(huì)自動(dòng)移植。)最初,我想用OrderID計(jì)算ExtendedAmount列的總數(shù)。我建立一個(gè)視圖,如列表B所示。

以下為引用的內(nèi)容:

USE [Northwind_New]
GO
/****** Object:?View [dbo].
[OrderDetailsSumByOrderID_vue]Script Date: 08/23/2006 16:31:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[OrderDetailsSumByOrderID_vue]
AS
SELECT TOP 100 PERCENT OrderID,
SUM(ExtendedAmount) AS TotalAmount
FROM?dbo.OrderDetails_New
GROUP BY OrderID
ORDER BY OrderID

列表B

我每行得到一個(gè)OrderID,ExtendedAmount的列數(shù)得到總計(jì)。(稱(chēng)之為OrderAmount,將航運(yùn),稅收等相加得到OrderTotal)。

我會(huì)在等式中引入一個(gè)表格UDF,如列表C所示。注意,我可以用兩種方法調(diào)用函數(shù):提交CustomerID將表格限定為那個(gè)顧客的訂單,或提交一個(gè)NULL獲得所有顧客訂單列表。如果我提交CustomerID,那么訂單列表就出現(xiàn)在OrderDate中;如果我提交NULL,列表就被分組并在CustomerID中由OrderDate排序。

以下為引用的內(nèi)容:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:? Arthur Fuller
-- Create date: 23 Aug 2006
-- Description:?? Table UDF to return Order Totals by Customer
-- Example: SELECT * FROM dbo.CustomerOrderTotals_fnt('VINET')
-- Example: SELECT * FROM dbo.CustomerOrderTotals_fnt(NULL)
-- Notes: This udf is designed to serve two
-- purposes. Pass a CustomerID to limit the rows to
-- that customer, or pass nothing to get all customers
-- =============================================
ALTERFUNCTION [dbo].[CustomerOrderTotals_fnt]
(????
????? -- Add the parameters for the function here
????? @CustomerID varchar(5)=NULL
)
RETURNS TABLE
AS
RETURN
??? (
????? -- Add the SELECT statement with parameter references here
??? SELECTTOP 100 PERCENT
? dbo.Customers.CustomerID,
? dbo.Customers.CompanyName,
? dbo.Orders.OrderID,
? dbo.Orders.OrderDate,
? dbo.OrderDetailsSumByOrderID_vue.TotalAmount
??? FROM??
? dbo.Customers
??? INNERJOIN
? dbo.Orders ON dbo.Customers.CustomerID = dbo.Orders.CustomerID
??? INNERJOIN
? dbo.OrderDetailsSumByOrderID_vue
? ON dbo.Orders.OrderID = dbo.OrderDetailsSumByOrderID_vue.OrderID
??? WHERE?
? dbo.Customers.CustomerID = @CustomerID
? OR @CustomerID ISNULL
??? ORDERBY dbo.Orders.OrderDate
??? )

--try it with these:
--SELECT * FROM dbo.CustomerOrderTotals_fnt('VINET')
--SELECT * FROM dbo.CustomerOrderTotals_fnt(NULL)
?
列表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 ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:? Arthur Fuller
-- Create date: 23 Aug 2006
-- Description:?? Return total sales by Customer
-- Example:
--? SELECT CustomerID, CustomerTotal
--????? FROM DBO.CustomerGrandTotal_fnt(null)
--? SELECT CustomerID, CustomerTotal
--????? FROM DBO.CustomerGrandTotal_fnt('VINET')
--? SELECT CustomerID, CustomerTotal
--????? FROM DBO.CustomerGrandTotal_fnt('VINET')
-- =============================================
CREATEFUNCTION CustomerGrandTotal_fnt
(????
????? @CustomerID varchar(5)
)
RETURNS TABLE
AS
RETURN
(
????? -- Add the SELECT statement with parameter references

關(guān)鍵詞標(biāo)簽:SQL Server

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法