如何在SQL Server中执行以下操作
DECLARE @Local nvarchar(20)
SET @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN
(IF @Local = 'True'
SELECT AllIDs FROM ATable
ELSE
SELECT TeamIDs FROM TeamTable
)
答案 0 :(得分:2)
去找工会: -
SELECT * FROM My_Table WHERE my_id IN
(
SELECT AllIDs AS MyIDs FROM ATable WHERE @Local = 'True'
UNION
SELECT TeamIDs AS MyIDs FROM TeamTable WHERE @Local <> 'True'
)
答案 1 :(得分:1)
SELECT *
FROM mytable
WHERE my_id IN
(
SELECT allids
FROM atable
WHERE @Local = 'True'
)
UNION ALL
SELECT *
FROM mytable
WHERE my_id IN
(
SELECT teamids
FROM teamtable
WHERE COALESCE(@Local, '') <> 'True'
)
优化器将优化掉错误的查询,因此性能将与相应(剩余)查询的性能相同。
答案 2 :(得分:1)
DECLARE @Local nvarchar(20)
SET @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN (
SELECT AllIDs FROM ATable
WHERE @Local = 'True'
UNION ALL
SELECT TeamIDs FROM TeamTable
WHERE @Local != 'True'
)
答案 3 :(得分:1)
(至少如果你关心表现的话,不会这样)
肯定有一种方法可以做到这一点,但你确实不应该 - 原因是(一般来说)单个语句只有1个执行计划,但是你基本上有2个(可能)非常不同的要求:
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM ATable)
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM TeamTable)
组合这两个查询意味着SQL服务器只能使用1个exectuion计划同时尝试和优化这两个查询。根据两个表的差异,这可能会正常工作,或者可能会出现可怕的错误。
例如,如果ATable
只包含1行,而TeamTable
包含My_Table
中的所有ID,则SQL Server必须在执行查找之间选择/妥协(最好使用ATable
)和表扫描(最好是使用TeamTable
) - 无论它最终做什么,SQL服务器都不可能使用最佳执行计划执行两个查询(除非两个执行计划恰好是相同)。
您应该使用2个语句:
DECLARE @Local nvarchar(20)
SET @Local = 'True'
IF @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM ATable)
ELSE
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM TeamTable)
事实上,在这种特殊情况下,您可能最好选择ID列表到临时表中。