【问题标题】:Find Duplicates using Derived Tables Only仅使用派生表查找重复项
【发布时间】:2011-10-10 18:52:20
【问题描述】:

cte 有时会占用大量内存。在其他数据库出现内存问题之前,以下 SQL 运行良好。

关于如何使用派生表重现 Row_Number Over Partition 的任何想法。

表 A 存放着工作电话。 表 B 保存 ID。 我们必须将表 A 与表 B 连接起来才能在表 B 中找到重复项;使用手机作为重复条件。

此 SQL 有效。我只想查看使用派生表的建议。

;WITH cte
                 AS (SELECT Row_number() OVER (PARTITION BY a.WorkPhone ORDER BY b.id DESC ) AS
                            rownumber
                            ,
                            a.WorkPhone,
                            a.id
                     FROM   TableB B
                            JOIN TableA a
                              ON b.GroupofLeadsid = a.id
                     WHERE  b.GroupofLeads = @GroupofLeads
                            AND NOT a.WorkPhone IS NULL
                            AND a.WorkPhone <> '')

            UPDATE b
            SET    b.deleteflag = 1
            FROM   TableB b
                   JOIN cte t
                     ON b.id = t.id
            WHERE  b.GroupofLeads = @GroupofLeads
                   AND rownumber > 1    

【问题讨论】:

  • 这个问题的整个概念没有意义。派生表与 CTE 没有不同的性能特征,只是语法稍不灵活。两者基本上都是内联视图。
  • 在查看查询分析器的同时尝试运行 CTE 与派生表,您会发现性能上有很大差异。
  • 不,没有。您认为您看到的任何性能差异都将归因于其他原因。例如参数嗅探。

标签: sql sql-server-2005 tsql


【解决方案1】:
Update TableB
Set deleteflag = 1
From TableB As B
    Join    (
            Select Row_Number() Over ( Partition By A.WorkPhone Order By B.Id Desc ) As RowNum
                , A.WorkPhone, A.Id
                , B.Id
            From TableB As B1
                Join TableA As A1
                    On A1.id = B1.GroupOfLeadsId
            Where B1.GroupOfLeadsId = @GroupOfLeads
                And A.WorkPhone <> ''
            ) As CTE
        On CTE.Id = B.Id
Where CTE.RowNum > 1

另一种选择:

Update TableB
Set deleteflag = 1
Where Exists    (
                Select 1
                From    (
                        Select Row_Number() Over ( Partition By A.WorkPhone Order By B.Id Desc ) As RowNum
                            , B.Id
                        From TableB As B1
                            Join TableA As A1
                                On A1.id = B1.GroupOfLeadsId
                        Where B1.GroupOfLeadsId = @GroupOfLeads
                            And A.WorkPhone <> ''
                        ) As CTE
                Where CTE.RowNum > 1
                    And CTE.Id = TableB.Id
                )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2022-01-02
    • 2017-06-07
    • 1970-01-01
    • 2018-04-08
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多