1

在一个典型的存储过程中,我正在使用如下相同的查询进行各种检查。

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks)

我想(SELECT ProjectId FROM Tasks)用 a替换查询,但对它必须是variable什么感到困惑。你知道吗?缓存这个结果也是有害的,或者有更简单的方法来做到这一点。 datatype

4

2 回答 2

1

这种形式更可取(尽管优化器应该执行这种优化):

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId

然后将条件添加为 WHERE 子句(而不是执行内部选择并尝试将 ProjectId 的列表放入变量中):

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId
WHERE someCondtionOnTasksTable
于 2012-01-19T07:04:52.843 回答
1

您可以创建表类型变量并多次使用它,如下所示:

CREATE @Projects TABLE(Id INT NOT NULL)

INSERT @Projects SELECT ProjectId FROM Tasks

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM @Projects)
SELECT ... FROM Projects WHERE ProjectId NOT IN (SELECT ProjectId FROM @Projects)

虽然 - 它不是用变量替换查询,它使子查询结果更可重用

在某些情况下,这可能会降低您的查询性能

于 2012-01-19T07:28:40.030 回答