Sql 删除doublon内部联接

Sql 删除doublon内部联接,sql,sql-server,Sql,Sql Server,如何从预算中仅选择前1名公司以删除重复记录 update r set Comp = t.Comp from [QlikDataWarehouse].[dbo].[Vente]r with (NOLOCK) inner join [QlikDataWarehouse].[dbo].[Budget] t on t.[Code Site] = r.[Code Site] and t.[Code Rayon] = substring(r.[Code Struct

如何从预算中仅选择前1名公司以删除重复记录

update r
   set Comp = t.Comp
from [QlikDataWarehouse].[dbo].[Vente]r with (NOLOCK) inner join
     [QlikDataWarehouse].[dbo].[Budget] t
     on t.[Code Site] = r.[Code Site] and
        t.[Code Rayon] = substring(r.[Code Structure],1,4) and
        t.[Date Time] = convert(date,r.[Date Time])
where r.[Date Time] >= '2015-01-01 00:0:00.000';

试着这样做:

with topComp as (
  select t.[Code Site], t.[Code Rayon], t.[Date Time], max(t.[Comp])
  from [QlikDataWarehouse].[dbo].[Budget] t
  group by t.[Code Site], t.[Code Rayon], t.[Date Time]
);

update r
   set Comp = t.Comp
from [QlikDataWarehouse].[dbo].[Vente]r with (NOLOCK) inner join
     topComp t
     on t.[Code Site] = r.[Code Site] and
        t.[Code Rayon] = substring(r.[Code Structure],1,4) and
        t.[Date Time] = convert(date,r.[Date Time])
where r.[Date Time] >= '2015-01-01 00:0:00.000';

如果我理解正确,您对
预算表有多个匹配项,您只需要一个。如果是,则使用
交叉应用
而不是
加入
。例如,要获取最新记录,请执行以下操作:

update r
   set Comp = t.Comp
from [QlikDataWarehouse].[dbo].[Vente]r with (NOLOCK) cross apply
     (select top 1 t.*
      from [QlikDataWarehouse].[dbo].[Budget] t
      where t.[Code Site] = r.[Code Site] and
            t.[Code Rayon] = substring(r.[Code Structure],1,4) and
            t.[Date Time] = convert(date,r.[Date Time])
      order by t.[Date Time] desc
     ) t
where r.[Date Time] >= '2015-01-01 00:0:00.000';

我认为您可以使用与中相同的方法。

如果没有
Id
列,您可以在
[日期时间]

上执行大于。您的问题对我来说没有多大意义。为什么你想要top 1,这样你就可以复制?我不太明白。如果您试图删除,为什么要使用update?update语句和NOLOCK,至少我不想知道会发生什么…只是让您知道。在这样的更新中使用NOLOCK可能会损坏索引,并且自2005年以来,该语法已被弃用。