Найти дубликаты, используя только производные таблицы - PullRequest
0 голосов
/ 10 октября 2011

cte иногда может быть боровом памяти.Следующий SQL прекрасно работает, пока не возникнут проблемы с памятью в других базах данных.

Любые идеи, как воспроизвести Row_Number Over Partition с использованием производных таблиц.

Таблица A содержит рабочий телефон.Таблица B содержит идентификатор.Мы должны объединить таблицу 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    

1 Ответ

0 голосов
/ 10 октября 2011
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
                )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...