SQL Server 2005 - 用于存储RowSet的变量的DataType

时间:2012-01-19 06:58:23

标签: sql-server-2005 tsql sqldatatypes sql-in

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

Althought - 它不是替换的变量查询,它使子查询结果更加可重用

<强>但是

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