sql-server - 如何删除**IN**查询Sql中的冗余条件

标签 sql-server t-sql optimization query-optimization

我有这样的疑问。但我需要优化这个查询,这样如何才能使用相同的分割函数省略冗余条件。

DECLARE @Filter nvarchar(20)
SELECT @Filter ='5,22,3'

SELECT * FROM    Employee e
             WHERE e.code IN 
             (
             CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (5, 16, 20, 23, 33, 49, 62, 90, 91, 92, 93, 94))>0) THEN 5 ELSE 0 END 
             ,CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (22, 18))>0) THEN 46 ELSE 0 END
             ,CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (3, 28))>0) THEN 3 ELSE 0 END
             )

最佳答案

正如@Damien_The_Unknowner所说,避免将字符串拆分为值表。您不需要多次分割同一个字符串。相反,您可以使用临时表变量。

DECLARE @SplitStrings TABLE
(
    splitdata int
)

INSERT @SplitStrings
SELECT splitdata FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d

DECLARE @EmployeeCodes TABLE
(
    splitdata INT,
    code int
)

INSERT @EmployeeCodes (splitdata, code)
VALUES (5, 5), (16, 5), (20, 5), (23, 5), (33, 5), (49, 5), (62, 5), (90, 5), (91, 5), (92, 5), (93, 5), (94, 5), 
       (22, 46), (18, 46),
       (3, 3), (28, 3)


SELECT e.* 
FROM Employee e
JOIN @EmployeeCodes ec
ON e.code = ec.code
JOIN @SplitStrings ss
ON ec.splitdata = ss.splitdata

我希望这是您正在寻找的方向。

注意:假设您不需要 0 作为员工代码。

关于sql-server - 如何删除**IN**查询Sql中的冗余条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42828157/

相关文章:

c++ - GNU GCC 编译器优化和调试

optimization - 确定内核中最需要寄存器的部分

sql-server - SQL Server Denali中的数据沿袭

mysql - 选择具有最大列值的行由另一列分组而没有嵌套的 select 语句

sql-server - 为什么在派生表的存储过程中使用UNION?

sql - T-SQL(azure 兼容)从一列中获取值作为一行数据

sql-server - 如何配置存储过程来访问另一个数据库中的表

sql-server - 在没有 MDS 的情况下部署 SQL 2008 R2 MDS 函数

sql-server - 如何编写T-SQL递归查询以使用普通自连接表存储树数据返回分层数据

ruby - 将 levenshtein 算法的 damerau 版本优化为优于 O(n*m)