Запрос дублирующихся строк во временной таблице приводит к строкам, которые не являются дубликатами - PullRequest
0 голосов
/ 11 октября 2018

Для воспроизведения я создаю следующую временную таблицу и заполняю ее данными:

CREATE TABLE #TempActualsImport 
(
        AID                 INT                 NULL,
        PostedDate          NVARCHAR(255)       NULL,
        AccountingPeriod    NVARCHAR(255)       NULL,
        JournalDate         NVARCHAR(255)       NULL,
        JournalID           NVARCHAR(255)       NULL,
        JournalDescription  NVARCHAR(1000)      NULL,
        JournalLine         INT                 NULL, 
        PaymentAmt          NVARCHAR(255)       NULL,
        RelativeAmount      NUMERIC(32,2)       NULL,
        IRSDuplicateRows    BIT                 DEFAULT 0 NULL, 
        Recstamp            Timestamp
)

Следующий запрос обновляет временную таблицу на основе следующих критериев, чтобы найти дубликаты, называемые дубликатами IRS.

UPDATE #TempActualsImport 
SET IRSDuplicateRows = 1
WHERE AID IN (SELECT t1.AID 
              FROM #TempActualsImport t1, #TempActualsImport t2 
              WHERE t1.PostedDate = t2.PostedDate
                AND t1.AccountingPeriod = t2.AccountingPeriod
                AND t1.JournalDate = t2.JournalDate
                AND t1.JournalID = t2.JournalID
                AND t1.JournalDescription = t2.JournalDescription
                AND t1.JournalLine = t2.JournalLine
                AND t1.PaymentAmt = t2.PaymentAmt
                AND t1.RelativeAmount = t2.RelativeAmount
                AND CONVERT(DATE, t1.PostedDate) = '2018-10-03'   
                AND t1.RelativeAmount = 0
                AND t1.AID = t2.AID)

Следующий запрос выполняется к временной таблице:

SELECT
    AID, PostedDate, AccountingPeriod, 
    JournalDate, JournalID, JournalDescription, JournalLine, PaymentAmt, 
    RelativeAmount, IRSDuplicateRows
FROM
    #TempActualsImport 
WHERE
    IRSDuplicateRows = 1

Следующие две строки помечены как дубликаты, но ясно, что JournalLine (7-й столбец в) НЕ соответствуетэти две записи.

589 20181003    4   20181002    PR00154645  10/02/2018 Payroll  8399         
0.00    1

808 20181003    4   20181002    PR00154645  10/02/2018 Payroll  15888        
0.00    1

Я ожидаю, что эти две записи не будут отображаться как дубликат IRS, поскольку столбец JournalLine не совпадает.Что я делаю неправильно?

Я проверил это на SQL Server 2008 R2 и SQL Server 2016 с такими же результатами.

Вот некоторые примеры данных для заполнения #TempActualsImport:

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (589, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 8399, N'', CAST(0.00 AS Numeric(32, 
2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (711, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12486, N'', CAST(1846.96 AS 
Numeric(32, 2)))
GO

 INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
 [JournalDate], [JournalID], [JournalDescription], [JournalLine], 
 [PaymentAmt], [RelativeAmount]) VALUES (712, N'20181003', N'4', 
 N'20181002', N'PR00154645', N'10/02/2018 Payroll', 12487, N'', CAST(169.33 
 AS Numeric(32, 2)))
 GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (713, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12488, N'', CAST(205.46 AS Numeric(32, 
2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (714, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12489, N'', CAST(121.95 AS Numeric(32, 
2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (715, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12490, N'', CAST(19.48 AS Numeric(32, 
2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (716, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12663, N'', CAST(1538.85 AS 
Numeric(32, 2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (717, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 12664, N'', CAST(13.57 AS Numeric(32, 
2)))
GO

INSERT [#TempActualsImport] ([AID], [POSTEDDate], [AccountingPeriod], 
[JournalDate], [JournalID], [JournalDescription], [JournalLine], 
[PaymentAmt], [RelativeAmount]) VALUES (808, N'20181003', N'4', N'20181002', 
N'PR00154645', N'10/02/2018 Payroll', 15888, N'', CAST(0.00 AS Numeric(32, 
2)))
GO

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Хорошо, теперь, когда я сам выполнил запрос с предоставленным вами примером кода, я могу объяснить, почему вы увидели поведение, которое видели.

Как я уже писал в своем комментарии, я ожидал, что обновление, которое вы использовали, помечает каждую строку как дубликат.Причина в том, что когда вы присоединяете таблицу к себе, каждая строка будет иметь совпадающую строку на другой стороне соединения, потому что каждая строка будет соответствовать сама себе.

Однако в вашем случае только две строки, которыесовпадали и были отмечены как дубликаты строк с «0,00» в столбце RelativeAmount.И причина тому - эта строка в ОБНОВЛЕНИИ, которую я раньше не замечал:

AND t1.RelativeAmount = 0

Закомментируйте эту строку и ВСЕ строки в вашей таблице (с датой публикации 10/3)будут помечены как дубликаты.

0 голосов
/ 12 октября 2018

Закончив тестирование, следующее смогло решить проблему и найти дубликаты, которые я проверяю, используя общее табличное выражение.(примечание: пришлось добавить; перед WITH для этого для компиляции в хранимой процедуре)

;WITH CTE AS
(SELECT *, ROW_NUMBER() OVER (PARTITION BY PostedDate, AccountingPeriod, JournalDate, 
JournalID,  JournalLine,JournalDescription,
    PaymentAmt, RelativeAmount
ORDER BY (SELECT 0)) AS DuplicateRowNumber
    FROM #TempActualsImport
    WHERE CONVERT(DATE,PostedDate)  = '2018-10-03' 
    AND PaymentAmt = 0
)
Update CTE SET IRSDuplicateRows = 1 
where DuplicateRowNumber > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...