SQL Server IN 谓词中用什么替换子查询

What to use to replace the subquery in the SQL Server IN predicate

通常我们有一个IN谓词的子查询。但我喜欢存储子查询的结果并在多个 IN 谓词中使用它。我尝试了临时 table 但出现错误 - "Error 137: Must declare the scalar variable @xxx".

假设我有一本书table书籍:

ISBN | Title | Price | InStock(true/false)

DECLARE @SoldBooks TABLE (ISBN int)
INSERT INTO @SoldBooks(ISBN) SELECT DISTINCT ISBN FROM Books WHERE InStock = 0
SELECT Title FROM Books WHERE ISBN IN @SoldBooks

我只是以这个脚本为例来说明我的问题。请不要告诉我有更好的方法来获得头衔。显然下面的代码有效,

SELECT Title FROM Books WHERE ISBN IN (SELECT DISTINCT ISBN FROM Books WHERE InStock = 0)

但我真的很想找到一种存储子查询的方法。感谢您的任何建议。

您可以像您描述的那样使用 table 变量:

DECLARE @SoldBooks TABLE (ISBN int)
INSERT INTO @SoldBooks(ISBN) 
SELECT DISTINCT ISBN 
FROM Books 
WHERE InStock = 0

那么你必须像对待普通的 table:

一样对待 table 变量
SELECT Title 
FROM Books 
WHERE ISBN IN (SELECT ISBN FROM @SoldBooks)

使用常见的 table 表达式:

WITH ExpressionName As (
   Your Subquery goes here
)
select * from someTable1 t1
inner join someTable2 t2 ON ...
where t1.SomeValue IN (select * from ExpressionName)
  and t2.SomeValue IN (select * from ExpressionName)

此外,如果您经常这样做,通常 在这些情况下使用 JOIN 更好:

WITH ExpressionName As (
   Your Subquery goes here
)
select * 
from tableTable
inner join someExpression ON ....

最后,如果 "several IN predicates" 你的意思是更多地在不同的查询和报告中而不是在同一个查询中重复使用这个相同的表达式,你应该创建一个查看:

CreateView SoldBooks As
   SELECT DISTINCT ISBN 
   FROM Books 
   WHERE InStock = 0

现在您可以在 SELECT 情况下使用此视图,就像在 table 中一样。关于 JOININ() 的相同建议仍然适用。