2

如何在 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
    )
4

4 回答 4

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'
)
于 2010-02-16T12:49:11.077 回答
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'
        )

优化器将优化掉错误的查询,因此性能将与相应的(剩余的)查询一样。

于 2010-02-16T12:47:48.310 回答
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'
)
于 2010-02-16T12:48:00.420 回答
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 Server 被迫只使用 1 个执行计划同时尝试和优化这两个查询。根据这两个表的不同程度,这可能会正常工作,或者可能会出现非常可怕的错误。

例如,如果ATable仅包含 1 行,而TeamTable包含其中的所有 id,则 SQL 服务器必须在查找(如果使用最好)和表扫描(如果使用最好)My_Table之间进行选择/折衷- 无论它最终做什么都不是SQL Server 可以使用最佳执行计划执行两个查询(除非两个执行计划碰巧相同)。ATableTeamTable

您应该改用 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 列表选择到临时表中。

于 2010-02-16T13:06:40.737 回答