2014-04-09 3 views
-1

Когда я запускаю этот SQL-код, я получаю следующее сообщение об ошибке:обновления таблицы SQL на основе результатов Суб-Select

Msg 116, Level 16, State 1, Line 17 
Only one expression can be specified in the select list when the subquery 
is not introduced with EXISTS. 

То, что я хочу, это когда-нибудь возвращается из моего запроса на обновление, которое имеет тот же AgreementNo, ElementStartDate and DateSeqNo, он обновляет одну из этих повторяющихся записей с помощью ElementStartDate + 1, который удалит дубликат.

Update [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
SET ElementStartDate = ElementStartDate + 1 
WHERE AgreementNo IN 
    (SELECT 
     count(*) as [Count], 
     [AgreementNo], 
     [ElementStartDate], 
     [DateSeqNo], 
     getdate() as Today 
    FROM [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
    GROUP BY 
     [AgreementNo], 
     [ElementStartDate], 
     [DateSeqNo] 
    HAVING COUNT(*) = 2) 
+0

Но разве это не создало бы новые дубликаты? Если, например, существует два экземпляра «СоглашенияNo1, ElementStartDate1, DateSeqNo1» и один экземпляр «СоглашенияNo1, ElementStartDate2, DateSeqNo1», где 'ElementStartDate2 = ElementStartDate1 + 1', разбивая пару дубликатов, используя вашу логику, фактически приведет к одному' СоглашениюNo1, ElementStartDate1, DateSeqNo1 'и два' СоглашенияNo1, ElementStartDate2, DateSeqNo1'. –

+0

Привет, Андрей, я вижу, откуда вы. Однако каждая запись поступает только в тот же день каждый месяц, и поэтому, увеличивая значение «ElementStartDate», гарантируется, что не будет другой записи за день + 1. Я понимаю, что это не лучший вариант для того, что я пытаясь достичь, но это требуется только в течение 3-6 месяцев, поэтому я действительно ищу быстрое решение. – user3515329

ответ

1

Присвоить номера строк в разбиений AgreementNo, ElementStartDate, DateSeqNo и обновлять эти строки, где номер строки больше, чем 1:

WITH ranked AS (
    SELECT 
    ElementStartDate, 
    rn = ROW_NUMBER() OVER (PARTITION BY AgreementNo, ElementStartDate, DateSeqNo 
           ORDER BY (SELECT 1)) -- actual order probably 
                 -- doesn't matter here 
    FROM WASP_Mart_EmbassyActuarial.dbo.tblARM_OmegaSource 
) 
UPDATE ranked 
SET ElementStartDate = ElementStartDate + rn - 1 
WHERE rn > 1 
; 

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

+0

Спасибо Andriy, отлично работает! – user3515329

1

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

Try ниже запроса:

Update [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
SET ElementStartDate = ElementStartDate + 1 
WHERE AgreementNo IN 
(SELECT [AgreementNo] 
    FROM [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
    GROUP BY [AgreementNo] -- OR [AgreementNo],[ElementStartDate],[DateSeqNo] 
    HAVING COUNT(*) = 2) 
+0

Спасибо за ваш быстрый ответ. Обновление [WASP_Mart_EmbassyActuarial]. [DBO]. [TblARM_OmegaSource] SET ElementStartDate = ElementStartDate + 1 ГДЕ AgreementNo В (SELECT [AgreementNo] FROM [WASP_Mart_EmbassyActuarial]. [DBO]. [TblARM_OmegaSource] GROUP BY [AgreementNo], [ ElementStartDate], [DateSeqNo] HAVING COUNT (*) = 2) Тем не менее, это обновляет все строки, которые возвращаются, тогда как я хочу только обновлять те, которые имеют те же соглашенияNo и ElementStartDate и DateSeqNo, и просто обновлять 1 дубликатов, которые затем удаляют это дублирующее значение. – user3515329

0

Может попробовать это:

Update [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
SET ElementStartDate = ElementStartDate + 1 
WHERE AgreementNo IN 
(SELECT 
     AgreementNo 
    FROM [WASP_Mart_EmbassyActuarial].[dbo].[tblARM_OmegaSource] 
    GROUP BY 
     [AgreementNo], 
     [ElementStartDate], 
     [DateSeqNo] 
    HAVING COUNT(*) = 2) 
+0

Спасибо за ваш быстрый ответ, похоже, это то же самое, что и другое сообщение. Тем не менее, он очень близок, он обновляет все строки, которые возвращаются, тогда как я хочу только обновить те, которые имеют те же соглашенияNo, ElementStartDate и DateSeqNo и просто обновляют 1 дубликатов, которые затем удаляют это дублирующее значение. – user3515329

Смежные вопросы