假设我有一个存储过程,当参数
因此,在那个逻辑之后,我最终得到这样一条语句:
这个方法可行,但是我认为在MyTable包含大量行的情况下,将MyTable与@ValidIds连接起来比使用
是否有一种方法可以做到像下面这样而不写多个查询?(实际查询非常大,因此具有和没有连接的多个版本并不理想)
@ComplicatedSearch = 1
时,会执行复杂的逻辑。 当它设置为1时,我将填充变量表 @ValidIds
,其中包含此过程可以返回的有效行。 当它为0时,逻辑被绕过,我们不需要过滤要返回的行。因此,在那个逻辑之后,我最终得到这样一条语句:
SELECT
m.*
,a.*
FROM
MyTable m
INNER JOIN AdditionalInfoTable a
ON m.Id = a.MyTableId
WHERE
(@ComplicatedSearch = 0 OR EXISTS(SELECT * FROM @ValidIds WHERE Id = m.Id))
这个方法可行,但是我认为在MyTable包含大量行的情况下,将MyTable与@ValidIds连接起来比使用
EXISTS()
更有效率。是否有一种方法可以做到像下面这样而不写多个查询?(实际查询非常大,因此具有和没有连接的多个版本并不理想)
SELECT
m.*
,a.*
FROM
MyTable m
ONLY DO THIS IF ComplicatedSearch = 1 PLEASE: INNER JOIN @ValidIds v
ON m.Id = v.Id
INNER JOIN AdditionalInfoTable a
ON m.Id = a.MyTableId
JOIN
比EXISTS
更快是错误的。在SQL Server中,EXISTS
被实现为半连接并且非常高效,并且可以使用任何可用的连接类型。 - Martin SmithOPTION (RECOMPILE)
以便考虑到@ComplicatedSearch
的值和表变量基数。还要确保使用Id primary key
声明表变量以在该列上创建索引。 - Martin Smith