Обновить дубликаты данных на основе первого - PullRequest
0 голосов
/ 20 сентября 2018

Может кто-нибудь помочь мне в моей проблеме, поэтому я хочу сделать запрос, с помощью которого я могу обновить данные, которые являются двойными, например: у меня есть данные с тем же B.OTO_ID, и один из них правильно вводит VLI_OMDF_IDданные, в то время как с другим NULL, я хочу сказать для всех данных в sql, что если есть два данных с одинаковым B.OTO_ID, но RACK - это другой код NULL, я ОБНОВЛЮ его так же, как и первый.

см. Рисунок

enter image description here

Поэтому мне нужно обновить таблицу 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 
;

Это мой запрос, к сожалению, я не могу его выполнить.

enter image description here

сообщения об ошибках:

Оператор MERGE пытался обновить или удалить одну и ту же строку более одного раза.Это происходит, когда целевая строка соответствует более чем одной исходной строке.Оператор MERGE не может многократно обновлять / удалять одну и ту же строку целевой таблицы.Оптимизируйте предложение ON, чтобы убедиться, что целевая строка соответствует хотя бы одной исходной строке, или используйте предложение GROUP BY для группировки исходных строк.

** моя таблица такая же, как ваша, вы только что сделали ее VLW_Liegenschaftдважды, и моя ссылка сделана через tbl1 VLW_Liegenschaft на tbl2 VLI_ID

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

В отсутствие ответов на мой комментарий, это может быть только часть пути к тому, что вы хотите ...

WITH
  expanded_VL_L AS
(
  SELECT
    L.*,
    W.VLW_OTOID,
    MAX(L.VLI_OMDF_ID) OVER (PARTITION BY W.VLW_OTOID)   AS MAX_VLI_OMDF_ID
  FROM
    VL_L  AS L
  INNER JOIN
    VL_W  AS W
      ON W.VLW_L = L.VLI_ID
)
UPDATE
  expanded_VL_L
SET
  VLI_OMDF_ID = MAX_VLI_OMDF_ID
WHERE
  VLI_OMDF_ID IS NULL

Как вы можете видеть в приведенном ниже примере, это находит MAX()всех связанных строк и заменяет NULL на MAX().

Если это не то, что вы хотите, пожалуйста, обновите ваш оригинальный пост.

0 голосов
/ 20 сентября 2018

Надеюсь, это поможет:

create table t1(VL_Liegenschaften nvarchar(128), VLW_OTOID nvarchar(128), VLI_OMDF_ID nvarchar(128))

create table t2(VL_Liegenschaften nvarchar(128), VLI_OMDF_ID nvarchar(128))

insert into t1
values('59806', 'B.178.002', 'FRA_11'), ('60001', 'B.178.002', null), ('69001', 'B.178.002', null)

insert into t2
values('59806', 'FRA_11'), ('60001', null), ('69001', null)

merge into t2
using(select t.VL_Liegenschaften, t1.VLI_OMDF_ID 
    from t1 
    join t1 as t on t1.VLW_OTOID = t.VLW_OTOID
    where t.VLI_OMDF_ID is null) t
on (t.VL_Liegenschaften = t2.VL_Liegenschaften 
    and t.VLI_OMDF_ID IS NOT NULL)
when matched then 
    update set t2.VLI_OMDF_ID = t.VLI_OMDF_ID 
;

ОБНОВЛЕНИЕ: обновить после уточнения условия

, если в первой таблице нет столбца VLI_OMDF_ID:

create table t1(VL_Liegenschaften nvarchar(128), VLW_OTOID nvarchar(128))

create table t2(VL_Liegenschaften nvarchar(128), VLI_OMDF_ID nvarchar(128))

insert into t1
values('59806', 'B.178.002'), ('60001', 'B.178.002'), ('69001', 'B.178.002'), ('79001', 'C.718.002'), ('79002', 'C.718.002')

insert into t2
values('59806', 'FRA_11'), ('60001', null), ('69001', null), ('79001', 'USA_01'), ('79002', null)

merge into t2
using(select t1.VL_Liegenschaften, t.VLI_OMDF_ID
from (
    select t2.VL_Liegenschaften, t2.VLI_OMDF_ID, t1.VLW_OTOID
     from t2 
     join t1 on t1.VL_Liegenschaften = t2.VL_Liegenschaften
    where t2.VLI_OMDF_ID IS NOT NULL
     ) t
    join t1 on t.VLW_OTOID = t1.VLW_OTOID) t
on (t.VL_Liegenschaften = t2.VL_Liegenschaften
    and t2.VLI_OMDF_ID IS NULL)
when matched then 
    update set t2.VLI_OMDF_ID = t.VLI_OMDF_ID 
;
0 голосов
/ 20 сентября 2018

Если я правильно понял, вы можете сделать что-то вроде этого, используя self join для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...