|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。在软件开辟的初始阶段,开辟商们老是想把全部体系的最小的细节计划好了,然后再往单线程的编写代码。如许软件开辟完成必要很长工夫,但开辟商们一向都在这么做。
以是开辟者不能不往减少他们的野心,先计划好一个小体系,但是这个小体系只是办理了全部体系困难中的一部分。这招致了由分歧的团队计划和创立的很多小体系几近都不克不及互相之间兼容。
今朝,很多构造都延聘了数据库建模者大概DBA,这些人能监视数据库计划和开辟。不幸的是,那些构造只要在呈现某些情况后,才会心识到在他们的员工中必要如许的人。
数据建模者和DBA面临的一个十分广泛的成绩就是,怎样在分歧的数据库中剖析SQL数据。本文将经由过程一个牢靠的办法来讲明这个成绩。
一个实例
在这个实例计划中,有两个包括类似数据的数据库:一个利用术语OrderNumber,另外一个利用术语OrderNo。第一个数据库有关头字而第二个数据库没有。
起首,你会在两个数据库中发明它们的按次是类似的。清单A创立了两个数据库(Test_Cross_1和Test_Cross_2),每一个数据库中有一个表(分离是Orders_1和Orders_2)。
假定Orders_1包含这些行:
以下为援用的内容:
OrderNumberOrderDate
2007-02-2300:00:00.000
2007-02-2400:00:00.000
2007-02-2500:00:00.000
假定Orders_2包含这些行:
OrderNo OrderDate
2007-02-2300:00:00.000
2 2007-02-2400:00:00.000
2007-02-2400:00:00.000
30112007-02-2500:00:00.000
一旦你分明了怎样援用表SQL实行兼并操纵是很复杂的。简而言之,你要有正当的名字。如清单B所示。这将不会乐成,由于Order_2包含一行Order_1没有的数据。改动毗连,到场对外毗连符也不会乐成,就像你在清单C中看到的那样。第二个查询失掉跟第一个查询不异的了局,由于OrderNo301不存在于第一个表中。找到这一行,你必需在第二个查询中,将这个表的按次反转。如清单D。如今你就可以发明不婚配的行了。
以下为援用的内容:
OrderNo OrderDate OrderNumberOrderDate
1 2007-02-2300:00:00.0001 2007-02-2300:00:00.000
2 2007-02-2400:00:00.0002 2007-02-2400:00:00.000
2007-02-2400:00:00.000NULLNULL
2007-02-2500:00:00.00030112007-02-2500:00:00.000
假定有一些行存在于Order_1中而不存在于Order_2中。你将下面的查询翻转,它也能事情,但是,随后你会失掉两个查询和两个了局集,并停止你的查询,这些你都必需手动对照。假如每一个表只要四行,这是不坚苦的,可是设想一下假如有4,000行纪录的话,怎样利用这类不实在际的办法举行对照呢。你必需对两个表的每行没呈现在别的那张表的纪录举行反省。
以下为援用的内容:
CREATEDATABASE[Test_Cross_1]ONPRIMARY
(NAME=NTest_Cross_1,FILENAME=N
C:ProgramFilesMicrosoftSQLServerMSSQL.1MSSQLDATATest_Cross_1.mdf,
SIZE=2048KB,MAXSIZE=UNLIMITED,FILEGROWTH=1024KB)
LOGON(NAME=NTest_Cross_1_log,
FILENAME=NC:aProgramFilesMicrosoft
SQLServerMSSQL.1MSSQLDATATest_Cross_1_log.ldf,
SIZE=1024KB,MAXSIZE=2048GB,FILEGROWTH=10%)GO
USE[Test_Cross_1]
GO
CREATETABLE[dbo].[Orders_1]
([OrderNumber][int]NOTNULL,
[OrderDate][datetime]NOTNULL,
CONSTRAINT[PK_Orders_1]PRIMARYKEYCLUSTERED
([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]
CREATEDATABASE[Test_Cross_2]ONPRIMARY
(NAME=NTest_Cross_2,
FILENAME=NC:ProgramFilesMicrosoft
SQLServerMSSQL.1MSSQLDATATest_Cross_2.mdf,
SIZE=2048KB,MAXSIZE=UNLIMITED,FILEGROWTH=1024KB)
LOGON(NAME=NTest_Cross_2_log,
FILENAME=NC:ProgramFilesMicrosoft
SQLServerMSSQL.1MSSQLDATATest_Cross_2_log.ldf,
SIZE=1024KB,MAXSIZE=2048GB,FILEGROWTH=10%)GO
CREATETABLE[dbo].[Orders_2]
([OrderNo][int]NOTNULL,[OrderDate][datetime]
NOTNULLCONSTRAINT[DF_Orders_2_OrderDate]
DEFAULT(getdate()),CONSTRAINT[PK_Orders_2]
PRIMARYKEYCLUSTERED([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*FROMTest_Cross_1.dbo.Orders_1INNER
JOINTest_Cross_2.dbo.Orders_2
ONTest_Cross_1.dbo.Orders_1.OrderNumber
清单B
以下为援用的内容:
SELECT*FROMTest_Cross_1.dbo.Orders_1LEFTOUTER
JOINTest_Cross_2.dbo.Orders_2
ONTest_Cross_1.dbo.Orders_1.OrderNumber
清单C
以下为援用的内容:
SELECT*FROMTest_Cross_2.dbo.Orders_2LEFTOUTER
JOINTest_Cross_1.dbo.Orders_1
ONTest_Cross_2.dbo.Orders_2.OrderNo
清单D
优化的SQL查询算法,有效地提高查询速度 |
|