SQL Server:在vs中存在的使用

SQL Server:在vs中存在的使用,sql,sql-server,ssms,Sql,Sql Server,Ssms,我对何时在操作符和Exists操作符中使用有一些疑问。我知道他们都是什么 我有一个疑问: Insert into AuditCardTypeBenefit_New(AuditID, AuditType, CardTypeBenefitID, EventCode, CardTypeGroupID, AgeFrom, AgeTo, Gender, Cre

我对何时在操作符和Exists操作符中使用有一些疑问。我知道他们都是什么

我有一个疑问:

Insert into AuditCardTypeBenefit_New(AuditID, AuditType, CardTypeBenefitID, EventCode,
                                     CardTypeGroupID, AgeFrom, AgeTo, Gender,
                                     CreateBy, CreateDate,  Status,
                                     CancelReason, LastChangeBy, LastChangeDate) 
     select                 
         AuditID, AuditType, CardTypeBenefitID, EventCode,
         CardTypeGroupID, AgeFrom, AgeTo, Gender,
         CreateBy, CreateDate, Status,
         CancelReason, LastChangeBy, LastChangeDate
     from 
         AuditCardTypeBenefit
     where 
         exists (select * from PromotionEvent_New 
                 where PromotionEvent_New.EventCode = AuditCardTypeBenefit.EventCode)
我正在将记录插入到一个表中,该表中的记录必须同时存在于
promotionevent\u new(eventcode)
中才能存在于我正在插入的表中。这个查询工作正常。我想知道是否最好使用以下替代方案:

where EventCode in (select EVENTCODE from PromotionEvent)

两个查询都返回相同的结果-但哪一个更适合我的情况?

会更好吗?我们不能确切地回答这个问题,因为您确实需要进行测试。但是,我愿意说,在该查询中使用IN()不太可能获得更快的结果

存在的子查询是不寻常的,因为它使用了“相关性”,我们可以经常认为这些是要避免的事情。然而,如果某个东西“存在”,则测试不必返回任何存储的数据值,这在这方面类似于连接,所需的只是返回true或false。另一方面,IN确实要求子查询返回数据并比较值

近年来In()的性能得到了改进,因此它可以非常有效,但在性能方面,没有足够的创新来更改现有的查询


注意:如果子查询返回的值为空,NOT IN(此处为子查询)将受到影响。

当子查询结果非常大时,EXISTS子句比IN快得多。相反,当子查询结果非常小时,IN子句比EXISTS更快


IN子句不能将任何内容与NULL值进行比较,但EXISTS子句可以将所有内容与NULL值进行比较。

那么我应该使用EXISTS子句吗?子查询指的是promotionevent\u new中的数据?是,但是大多数时候,我们看不到in和exist之间存在任何重大的性能差异。请查看in和exist的执行计划,它们几乎肯定是相同的。我不记得见过他们有什么不同。因此,性能将是相同的。两者的语义对于null是相同的注意:这不适用于
不在
vs
不存在
如果子查询返回的任何值为空,则受影响。
不在
受影响,如果存在
值<在中,code>的行为应该类似于
EXISTS
,这意味着,如果没有
IS NULL,则
子句将返回相同的值。