【问题标题】:Want the results in the same order as the input [duplicate]希望结果与输入的顺序相同[重复]
【发布时间】:2014-12-29 22:48:03
【问题描述】:

我有这样的查询

SELECT NUM,
       col1,
       col2,
       col3,
       col4,
       col5,
       col6
FROM   (SELECT NUM,
               col1,
               col2
        FROM   (SELECT a.mid  AS NUM,
                       a.col1 AS col1,
                       a.col2 AS col2
                FROM   tbl a (nolock)
                WHERE  a.mid IN ( '09-404811,10-433495,10-433575,10-423789' )) AS MainQuery
               UNPIVOT ( LabelValue
                       FOR Label IN (NUM,
                                     col1,
                                     col2 ) ) AS UnpvtQuery) LT
       INNER JOIN #SetItemsTable tt
               ON tt.col7 = LT.col1
WHERE  LT.NUM IN ( '09-404811,10-433495,10-433575,10-423789' )
ORDER  BY Charindex(NUM, '09-404811,10-433495,10-433575,10-423789') 

这只是原始查询的表示。为 IN() 提供的值列表大约为 400+。

这个查询的问题是 ORDER BY CHARINDEX(NUM,'09-404811,10-433495,10-433575,10-423789') 需要将近 25 秒才能执行。否则查询的其余部分只需要 6 秒。 我正在使用CHARINDEX(),因为我需要与 IN() 中的值出现的顺序相同的结果。

我怎样才能有效地完成这项工作。

【问题讨论】:

  • 最简单的方法是使用高效的拆分函数。它是否会比您当前的方法明显更快还有待观察......
  • LT.NUM IN ( '09-404811,10-433495,10-433575,10-423789' ) 无论如何都不会做你想做的事。那是错字吗?应该是LT.NUM IN ( '09-404811','10-433495','10-433575','10-423789' )
  • @Martin 你是对的。这是一个错字。实际上我正在使用一个拆分函数,它接受一个逗号分隔的列表而不是单个字符串。
  • 所以让split函数返回一个索引列以及值,改为join而不是in,并按索引排序。
  • 根据骗局中的答案。

标签: sql sql-server


【解决方案1】:

我会先选择对临时表的内部查询,然后您可以根据需要进行查询和排序/分组。我会避免尝试使用 Charindex,因为它需要遍历所有返回的值。

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2019-05-29
    • 2013-01-19
    • 2010-10-27
    • 2021-03-08
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多