首页 > 解决方案 > 根据第一个更新重复数据

问题描述

谁能帮我解决我的问题,所以我想进行一个查询,我可以用它来更新双倍数据,例如:我有相同 B.OTO_ID 的数据,其中一个正确输入了 VLI_OMDF_ID 数据而使用另一个 NULL,我想对 sql 中的所有数据说,如果有两个数据具有相同的 B.OTO_ID 但 RACK 是另一个 NULL 代码,我将 UPDATE 它与第一个相同。

请看图片

在此处输入图像描述

所以我需要更新表 VL_Liegenschaften 列 VLI_OMDF_ID 如果 VL_Wohneinheiten 表中有两个 VLW_OTOID 其中一个是 VLI_OMDF_ID 为空

我希望你能理解我,非常感谢你的帮助

merge into VL_Liegenschaften
using(select VL_Wohneinheiten.VLW_Liegenschaft, t.VLI_OMDF_ID
from (
    select VL_Liegenschaften.VLI_ID, VL_Liegenschaften.VLI_OMDF_ID, VL_Wohneinheiten.VLW_OTOID
     from VL_Liegenschaften
     join VL_Wohneinheiten on VL_Wohneinheiten.VLW_Liegenschaft = VL_Liegenschaften.VLI_ID
    where VL_Liegenschaften.VLI_OMDF_ID IS NOT NULL
     ) t
    join VL_Wohneinheiten on t.VLW_OTOID = VL_Wohneinheiten.VLW_OTOID) t
on (t.VLW_Liegenschaft = VL_Liegenschaften.VLI_ID
    and VL_Liegenschaften.VLI_OMDF_ID IS NULL)
when matched then 
    update set VL_Liegenschaften.VLI_OMDF_ID = t.VLI_OMDF_ID 
;

这是我的查询,不幸的是我无法强制执行。

在此处输入图像描述

错误信息:

MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。一个 MERGE 语句不能重复更新/删除目标表的同一行。优化 ON 子句以确保目标行至少匹配一个源行,或使用 GROUP BY 子句对源行进行分组。

**我的表和你的一样,你只是做了两次 VLW_Liegenschaft,我的链接是通过 tbl1 VLW_Liegenschaft 到 tbl2 VLI_ID

标签: sqlsql-servertsqlsql-update

解决方案


如果我理解得很好,你可以做这样的事情,在 OTO_ID 上使用自联接来获取值。

declare @tbl as table (
    OTO_ID varchar(15)
    ,VLI_OMDF_ID varchar(15)
);

insert into @tbl values ('a18d5', 'hhgg'), ('a18d5', NULL), ('asasad', 'ffff'), ('asasad', NULL);


update t
    set t.VLI_OMDF_ID = t2.VLI_OMDF_ID
from @tbl t
inner join @tbl t2
    on t.OTO_ID = t2.OTO_ID
where t.VLI_OMDF_ID is NULL

推荐阅读