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

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

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

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

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

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

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

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

我增加了一個(gè)稱作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)語句。我用這個(gè)命令將它和值從原始表格中迅速移植出來:

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

SELECT * FROM [Northwind_New].[dbo].[Order Details]
?
既然我有一個(gè)多行的表格,是時(shí)候開始實(shí)驗(yàn)了。(一旦新列ExtendedAmount被計(jì)算,其值會自動移植。)最初,我想用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ì)。(稱之為OrderAmount,將航運(yùn),稅收等相加得到OrderTotal)。

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

<samp id="y5nmh"></samp>

    <table id="y5nmh"></table>
    <b id="y5nmh"><dfn id="y5nmh"><form id="y5nmh"></form></dfn></b>

    以下為引用的內(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)閱讀

    文章評論
    發(fā)表評論

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

    相關(guān)下載

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