Sql server 使用内部联接进行更新的TSQL语法
我试图将此mysql查询转换为在SQL上运行,但在join上的语法方面存在一些问题。基本上,我想做的是根据DWH_日期将重复行上的DWH_HISTO设置为1。因此,应标记旧的副本 这就是我尝试过的Sql server 使用内部联接进行更新的TSQL语法,sql-server,tsql,join,sql-update,Sql Server,Tsql,Join,Sql Update,我试图将此mysql查询转换为在SQL上运行,但在join上的语法方面存在一些问题。基本上,我想做的是根据DWH_日期将重复行上的DWH_HISTO设置为1。因此,应标记旧的副本 这就是我尝试过的 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(*)
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
使用内部联接进行更新:
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
我相信这就是您要寻找的语法:
;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
哇,有趣的语法:O不确定到底发生了什么,但会研究它:D谢谢you@C.Astraea它比join方法快