在軟體開發的初始階段,開發商們總是想把整個系統的最小的細節設計好了,然後再去單線程的編寫代碼。這樣軟體開發完成需要很長時間,但開發商們一直都在這麼做。
所以開發人員不得不去縮小他們的野心,先設計好一個小系統,然而這個小系統只是解決了整個系統難題中的一部分。這導致了由不同的團隊設計和建立的許多小系統幾乎都不能相互之間相容。
目前,許多組織都聘請了資料庫建模者或者DBA,這些人能監督資料庫設計和開發。不幸的是,那些組織只有在出現某些狀況後,才會意識到在他們的員工中需要這樣的人。
資料建模者和DBA面對的一個非常普遍的問題就是,如何在不同的資料庫中解析SQL資料。本文將通過一個可靠的方法來說明這個問題。
一個執行個體
在這個執行個體方案中,有兩個包含相似資料的資料庫:一個使用術語OrderNumber,另一個使用術語OrderNo。第一個資料庫有關鍵字而第二個資料庫沒有。
首先,你會在兩個資料庫中發現它們的順序是相似的。清單A建立了兩個資料庫(Test_Cross_1和Test_Cross_2),每個資料庫中有一個表(分別是Orders_1和Orders_2)。
假設Orders_1包括這些行:
以下為引用的內容: OrderNumberOrderDate 2007-02-23 00:00:00.000 2007-02-24 00:00:00.000 2007-02-25 00:00:00.000 假設Orders_2包括這些行: OrderNo OrderDate 2007-02-23 00:00:00.000 2 2007-02-24 00:00:00.000 2007-02-24 00:00:00.000 3011 2007-02-25 00:00:00.000 |
一旦你明白了如何參考資料表SQL執行合併作業是很簡單的。簡而言之,你要有合法的名字。如清單B所示。這將不會成功,因為Order_2包括一行Order_1沒有的資料。改變串連,加入對外串連符也不會成功,就像你在清單C中看到的那樣。第二個查詢得到跟第一個查詢相同的結果,因為OrderNo 301不存在於第一個表中。找到這一行,你必須在第二個查詢中,將這個表的順序反轉。如清單D。現在你就能發現不匹配的行了。
以下為引用的內容: OrderNo OrderDate OrderNumberOrderDate 1 2007-02-23 00:00:00.0001 2007-02-23 00:00:00.000 2 2007-02-24 00:00:00.0002 2007-02-24 00:00:00.000 2007-02-24 00:00:00.000 NULL NULL 2007-02-25 00:00:00.0003 011 2007-02-25 00:00:00.000 |
假設有一些行存在於Order_1中而不存在於Order_2中。你將上面的查詢翻轉,它也能工作,然而,隨後你會得到兩個查詢和兩個結果集,並結束你的查詢,這些你都必須手動比較。如果每個表只有四行,這是不困難的,但是想象一下如果有4,000行記錄的話,怎麼使用這種不切實際的方法進行比較呢。你必須對兩個表的每行沒出現在另外那張表的記錄進行檢查。
以下為引用的內容: CREATE DATABASE [Test_Cross_1] ON PRIMARY ( NAME = N'Test_Cross_1', FILENAME = N' C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATATest_Cross_1.mdf', SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Test_Cross_1_log', FILENAME = N'C:aProgram FilesMicrosoft SQL ServerMSSQL.1MSSQLDATATest_Cross_1_log.ldf', SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO USE [Test_Cross_1] GO CREATE TABLE [dbo].[Orders_1] ( [OrderNumber] [int] NOT NULL, [OrderDate] [datetime] NOT NULL, CONSTRAINT [PK_Orders_1] PRIMARY KEY CLUSTERED ( [OrderNumber] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] CREATE DATABASE [Test_Cross_2] ON PRIMARY ( NAME = N'Test_Cross_2', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATATest_Cross_2.mdf', SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Test_Cross_2_log', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATATest_Cross_2_log.ldf', SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO CREATE TABLE [dbo].[Orders_2] ( [OrderNo] [int] NOT NULL, [OrderDate] [datetime] NOT NULL CONSTRAINT [DF_Orders_2_OrderDate] DEFAULT (getdate()), CONSTRAINT [PK_Orders_2] PRIMARY KEY CLUSTERED ( [OrderNo] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
清單A
以下為引用的內容: SELECT * FROM Test_Cross_1.dbo.Orders_1INNER JOIN Test_Cross_2.dbo.Orders_2 ON Test_Cross_1.dbo.Orders_1.OrderNumber |
清單B
以下為引用的內容: SELECT * FROM Test_Cross_1.dbo.Orders_1LEFT OUTER JOIN Test_Cross_2.dbo.Orders_2 ON Test_Cross_1.dbo.Orders_1.OrderNumber |
清單C
以下為引用的內容: SELECT * FROM Test_Cross_2.dbo.Orders_2LEFT OUTER JOIN Test_Cross_1.dbo.Orders_1 ON Test_Cross_2.dbo.Orders_2.OrderNo |
清單D