【问题标题】:How can I optimize this SQL code further to run faster如何进一步优化此 SQL 代码以更快地运行
【发布时间】:2020-01-22 12:33:43
【问题描述】:
UPDATE N SET [actType] = 'X'
FROM tableA N
WHERE NOT EXISTS (SELECT 1  
                  FROM tableA O 
                  WHERE O.clientCode = N.clientCode AND 
                        O.[userName] = N.[userName] AND 
                        O.[profile] = N.[profile] AND 
                        O.[rankID] = N.[rankID] - 1 
                 ) AND 
      N.[rankID] NOT IN (SELECT MIN(T.[rankID]) 
                         FROM tableA T 
                         WHERE T.[userName] = N.[userName]
                        )

【问题讨论】:

  • 标记您正在使用的 DBMS。
  • 请说明您要实现的逻辑。样本数据和期望的结果也有帮助。
  • 这将取决于您拥有的数据和索引
  • 嗨@Sai Kiran,我建议使用 CodeReview (codereview.stackexchange.com) 来解决有关优化工作代码的问题。 StackOverflow 主要用于非工作代码。希望这能有所帮助。
  • @Prebsus 可能,但不是当前形式。缺乏描述,没有上下文,也没有EXPLAIN,我们无法按原样审查。

标签: sql sql-optimization


【解决方案1】:

您可以将row_number() 与可更新的cte 一起使用:

with cte as (
     select N.*, ROW_NUMBER() OVER (PARTITION BY [userName] ORDER BY rankID) AS Seq
     from tableA N
)
update c
     set c.[actType] = 'X'
from cte c
where seq > 1 and
      not exists (SELECT 1  
                  FROM tableA O 
                  WHERE O.clientCode = c.clientCode AND 
                        O.[userName] = c.[userName] AND 
                        O.[profile] = c.[profile] AND 
                        O.[rankID] = c.[rankID] - 1 
                );

您的语法建议SQL Server。所以,你可以使用。

【讨论】:

  • 非常感谢,我会试试这个:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多