gpt4 book ai didi

sql-server-2008 - T-SQL : Optional table joins?

转载 作者:行者123 更新时间:2023-12-04 13:53:55 25 4
gpt4 key购买 nike

假设我有一个存储过程,当使用@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与@ValidIds结合起来会比使用 EXISTS()更为有效,尤其是当MyTable包含大量行时。

有什么办法可以像我下面那样做而无需编写多个查询? (实际查询非常大,因此具有连接和不连接的多个版本并不理想)
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

最佳答案

另外一个选项:

SELECT
m.*
,a.*
FROM MyTable m
INNER JOIN @ValidIds v
ON m.Id = case
when @ComplicatedSearch = 1 then v.Id -- Filter rows
else m.Id -- Select all rows
end
INNER JOIN AdditionalInfoTable a
ON m.Id = a.MyTableId

您需要进行性能测试以查看其效率是否足够。一些快速测试表明(对于我的数据)生成了相同的查询计划,而不管第一个调用是针对复杂还是不复杂。

“ fork ”方法(单独的过程)应该是最有效的。但是,要在两个不同的地方进行较小的修改就拥有相同的代码可能会很难受支持,特别是当您必须对该代码的所有“实例”添加后续更改时。而且,如果数据的整体大小(例如整体性能)不是太大,那么“一种大小几乎适合所有人”的方法可能是最有效的。

关于sql-server-2008 - T-SQL : Optional table joins?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053236/

25 4 0