在我正在使用的典型存储过程中,使用与下面相同的查询进行各种检查。
SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks)
我想用(SELECT ProjectId FROM Tasks)
替换查询variable
,但我对它必须是datatype
感到困惑。 你知道吗?同样缓存这个结果是有害的,或者有更简单的方法来做到这一点。
答案 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 - 它不是替换的变量查询,它使子查询结果更加可重用
<强>但是强>
在某些情况下,这可能会降低查询的效果