sqlserverexist的简单介绍

本篇文章给大家谈谈sqlserverexist,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

sql server 嵌套查询语句中什么时候用in,什么时候又用exists!

sqlserver嵌套查询语句中使用in或者exists的场景和原则如下:

如果查询的两个表大小相当,那么用in和exists差别不大。两者都可以使用。

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,灶顷每次loop循环再对内表进行查询。所以当有多重循环,使用in更合适,效率越高。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。

NOT EXISTS,exists的猜漏用法跟in不一样穗辩烂,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度。

SQLSERVER语句 in和exists哪个效率高本人测试证明

例如下面两个SQL语句

1 SELECT OrderNo, SiteCode, AreaCode

2 FROM SchedulingProgram

3 WHERE AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode

4 FROM EnvBasicInfo

5 WHERE cityiD = 31 ) AND OrderNo NOT IN (

6 SELECT OrderNo

7 FROM KK_DeliveryinfoTmp )

上面SQL语句IN里面有IN和NOT IN

1 SELECT OrderNo, SiteCode, AreaCode

2 FROM SchedulingProgram

3 WHERE ( AreaCode IN ( 'P', 'M'蠢并 ) AND SiteCode IN ( SELECT SiteCode

4 FROM EnvBasicInfo

5 WHERE cityiD = 31 )

6 ) AND NOT EXISTS ( SELECT OrderNo

7 FROM KK_DeliveryinfoTmp

8 WHERE KK_DeliveryinfoTmp.OrderNo = SchedulingProgram.OrderNo )

上面的SQL语句IN里面又有NOT EXISTS

这样的情况很难测试同等条件下IN语句和EXISTS语句的效率

还有一个非SARG运算符

在《SQLSERVER企业级平台管理实践》的第424页里提到:

SQLSERVER对筛选条件(search argument/SARG)的写法有一定的建议

对于不使用SARG运算符的表达式,索引是没有用的,SQLSERVER对它们很难使用比较优化的做法。非SARG运算符包括

NOT、、NOT EXISTS、NOT IN、NOT LIKE和内部函数,例如:Convert、Upper等

所以当您的表中有索引并且SQL语句包含非SARG运算符,那么当测试SQL语句的执行时间的时候肯定相差很大,

因为有些SQL语句走索咐烂引,有些SQL语句不走索引

建表脚本

注意:两个表带简迹中都有索引!!

CT_FuelingData表

1 USE [GPOSDB]

2 GO

3 /****** 对象: Table [dbo].[CT_FuelingData] 脚本日期: 08/24/2013 11:00:34 ******/

4 SET ANSI_NULLS ON

5 GO

6 SET QUOTED_IDENTIFIER ON

7 GO

8 SET ANSI_PADDING ON

9 GO

10 CREATE TABLE [dbo].[CT_FuelingData](

11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,

12 [I_FD_StationNo] [int] NOT NULL,

13 [VC_FD_No] [varchar](50) NOT NULL,

14 [VC_FD_Cardno] [varchar](50) NOT NULL,

15 [I_FD_CardStatus] [int] NULL,

16 [LI_FD_CTC] [bigint] NOT NULL,

17 [I_FD_TypeCode] [int] NULL,

18 [I_FD_PumpID] [int] NOT NULL,

19 [VC_FD_OilType] [varchar](50) NULL,

20 [DE_FD_Volume] [decimal](18, 2) NULL,

21 [DE_FD_Price] [decimal](18, 2) NULL,

22 [DE_FD_Amount] [decimal](18, 2) NULL,

23 [I_FD_Point] [decimal](10, 2) NULL,

24 [D_FD_DateTime] [datetime] NOT NULL,

25 [VC_FD_GroupNo] [varchar](50) NULL,

26 [D_FD_GroupDate] [datetime] NULL,

27 [DE_FD_CardAmount] [decimal](18, 2) NULL,

28 [DE_FD_VolumeTotals] [decimal](18, 2) NULL,

29 [DE_FD_AmountTotals] [decimal](18, 2) NULL,

30 [I_FD_ISSend] [int] NULL,

31 [VC_FD_CardMoneyauthFile] [varchar](50) NULL,

32 [D_Month] [datetime] NULL,

33 CONSTRAINT [PK_CT_FuelingData_1] PRIMARY KEY CLUSTERED

34 (

35 [VC_FD_No] ASC

36 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

37 ) ON [PRIMARY]

38

39 GO

40 SET ANSI_PADDING OFF

CT_InhouseCard表

1 USE [GPOSDB]

2 GO

3 /****** 对象: Table [dbo].[CT_InhouseCard] 脚本日期: 08/24/2013 10:59:58 ******/

4 SET ANSI_NULLS ON

5 GO

6 SET QUOTED_IDENTIFIER ON

7 GO

8 SET ANSI_PADDING ON

9 GO

10 CREATE TABLE [dbo].[CT_InhouseCard](

11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,

12 [VC_IC_CardNO] [varchar](50) NOT NULL,

13 [VC_IC_PhysicalNO] [varchar](50) NULL,

14 [I_IC_CardType] [int] NULL,

15 [VC_IC_UserName] [varchar](50) NULL,

16 [VC_IC_JobNO] [varchar](50) NULL,

17 [VC_IC_UserID] [varchar](50) NULL,

18 [VC_IC_Password] [varchar](50) NULL,

19 [DE_IC_CardAmount] [decimal](18, 2) NULL,

20 [DE_IC_AppendAmount] [decimal](18, 2) NULL,

21 [DE_IC_ConsumerAmount] [decimal](18, 2) NULL,

22 [I_IC_ISLost] [int] NULL,

23 [D_IC_UsedDateTime] [datetime] NULL,

24 [D_IC_UselifeDateTime] [datetime] NULL,

25 [I_IC_IssueStationNO] [int] NULL,

26 [VC_IC_IssuerNO] [varchar](50) NULL,

27 [D_IC_IssueDateTime] [datetime] NULL,

28 [D_IC_LastUpdateDateTime] [datetime] NULL,

29 [I_IC_CardStatus] [int] NULL,

30 [VC_IC_Remark] [varchar](256) NULL,

31 CONSTRAINT [PK_CT_InhouseCard] PRIMARY KEY CLUSTERED

32 (

33 [VC_IC_CardNO] ASC

34 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

35 ) ON [PRIMARY]

36

37 GO

38 SET ANSI_PADDING OFF

sqlserver问题 exist的使用

select * from Table1 where Exists(select* from Table2 where Table1.姓名=Table2.姓名)

[img]

关于sqlserverexist和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表