首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多嵌套case查询的TSQL优化

多嵌套case查询的TSQL优化
EN

Stack Overflow用户
提问于 2017-01-12 10:27:46
回答 2查看 223关注 0票数 1

有人能帮我优化这个查询吗?我只写出了两个case语句,但它实际上有大约30个这样的case,它们都嵌套在下面的示例中(其中有2个)。

代码语言:javascript
运行
复制
SELECT * 
FROM QS
INNER JOIN R ON (CASE 
                    WHEN R.FieldCode = 'L'
                       THEN ---
                CASE 
                    when (
                    (R.Match = 1 AND QS.lineid 
                    IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))
                    OR (R.Match = 0 AND QS.lineid NOT IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))) then 1
                    ELSE 0 
                END
            ----
        WHEN R.FieldCode = 'D'   
            THEN 
                CASE 
                    when ((R.Match = 1 AND QS.productid 
                    IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))
                     OR (R.Match = 0 AND QS.productid NOT IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))) then 1
                    ELSE 0 
                END
END)=1
EN

回答 2

Stack Overflow用户

发布于 2017-01-12 10:40:21

这是非常糟糕的SQL代码,因为数据库引擎根本不能做任何优化,因为它需要枚举整个表,并逐个记录,对每个表进行多次测试,两次。

你可以在没有任何案例的情况下做到这一点:

代码语言:javascript
运行
复制
SELECT *
FROM QS
INNER JOIN R ON (   (R.FieldCode = 'L'
                     AND (   (R.Match = 1 AND QS.lineid IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))
                          OR (R.Match = 0 AND QS.lineid NOT IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))))
                 OR (R.FieldCode = 'D'
                     AND (   (R.Match = 1 AND QS.productid IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))
                          OR (R.Match = 0 AND QS.productid NOT IN (SELECT CONVERT(int,s) FROM SplitFunc(',', R.FieldValue)))))                 
                )
票数 0
EN

Stack Overflow用户

发布于 2017-01-12 10:48:38

这对你来说表现更好吗?由于不知道相对行数或底层数据,我认为这可能会更快、更容易维护,因为您不必一遍又一遍地运行标量函数,而且应该对优化器更友好。

代码语言:javascript
运行
复制
SELECT * -- Change to only get fields you need from QS.*
FROM (
    SELECT
        QS.*,
        ',' + CONVERT(VARCHAR(10),
            CASE R.FieldCode
                WHEN 'L' THEN QA.lineid
                WHEN 'D' THEN QA.productid
                -- ...
                END + ',' AS MatchValue,
        ',' + R.FieldValue + ',' AS FieldValueCSV
        R.Match
    FROM QS 
        CROSS JOIN R
    ) T
WHERE (T.Match = 1 AND T.FieldValueCSV LIKE '%' + T.MatchValue + '%')
    OR (T.Match = 0 AND NOT T.FieldValueCSV LIKE '%' + T.MatchValue + '%')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41604150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档