2017-02-07 2 views
0

Я пытаюсь преобразовать этот запрос mysql для запуска на SQL, но с некоторыми проблемами с синтаксисом при объединении. В основном, что я хочу сделать, установите DWH_HISTO в 1 на дублированных строках на основе DWH_DATE. Таким образом, старые дубликаты должны быть отмечены.Синтаксис TSQL для обновления с внутренним соединением

Это то, что я пытался

UPDATE MAG_L_D3.dbo.INSCRIPT 
INNER JOIN 
(SELECT MAX(DWH_DATE) as lastId, CODINS 
    FROM INSCRIPT 
    WHERE DWH_HISTO=0 
    GROUP BY CODINS 
    HAVING COUNT(*) > 1) duplic on duplic.CODINS = MAG_L_D3.dbo.INSCRIPT.CODINS 
    SET DWH_HISTO = 1 
    WHERE MAG_L_D3.dbo.INSCRIPT.DWH_DATE < duplic.lastId 

ответ

3

Обновление с помощью внутреннего соединения:

UPDATE I 
SET DWH_HISTO = 1 FROM MAG_L_D3.dbo.INSCRIPT I 
INNER JOIN 
(SELECT MAX(DWH_DATE) as lastId, CODINS 
    FROM INSCRIPT 
    WHERE DWH_HISTO=0 
    GROUP BY CODINS 
    HAVING COUNT(*) > 1) duplic on duplic.CODINS = I.CODINS 
    WHERE I.DWH_DATE < duplic.lastId 
4

Я считаю, что это синтаксис вы ищете:

;WITH CTE as 
(
    SELECT *, row_number() over (partition by CODINS order by DWH_DATE desc)rn 
) 
UPDATE CTE 
SET DWH_HISTO = 1 
WHERE 
    rn > 1 
    and DWH_HISTO=0 
+0

вау интересный синтаксис : O не совсем точно, что происходит, но изучит его: D Спасибо –

+0

@ C.Astraea быстрее, чем метод соединения –

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