如何在 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
)
如何在 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
)
去工会:-
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'
)
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'
)
优化器将优化掉错误的查询,因此性能将与相应的(剩余的)查询一样。
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'
)
(至少如果您关心性能,则不会)
当然有一种方法可以做到这一点,但你真的不应该 - 原因是(通常)单个语句只有一个执行计划,但是你基本上有 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 Server 被迫只使用 1 个执行计划同时尝试和优化这两个查询。根据这两个表的不同程度,这可能会正常工作,或者可能会出现非常可怕的错误。
例如,如果ATable
仅包含 1 行,而TeamTable
包含其中的所有 id,则 SQL 服务器必须在查找(如果使用最好)和表扫描(如果使用最好)My_Table
之间进行选择/折衷- 无论它最终做什么都不是SQL Server 可以使用最佳执行计划执行两个查询(除非两个执行计划碰巧相同)。ATable
TeamTable
您应该改用 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 列表选择到临时表中。