Есть ли способ скопировать и объединить целые строки в SQL и назначить им новые значения для одного столбца идентификатора связывания? - PullRequest
0 голосов
/ 09 января 2020

Я знаю, что есть этот вопрос , но я думаю, что мой сценарий немного отличается ...

Итак, у меня есть представление vw_BindingDataCurrent, и оно содержит BindingID, CaseID, набор других идентификаторов (PersonID, OrganizationID, ServiceID и некоторые другие) и некоторые другие столбцы, содержащие данные, связанные с привязкой. Теперь существует уникальное ограничение на идентификаторы в вспомогательной таблице для представления, отличного от BindingID, поэтому нельзя создать дублирующиеся строки, имеющие одинаковые значения для всех этих других идентификаторов.

Моя проблема в том, что я хотите найти в этом представлении строки, соответствующие одной из двух CaseID s, и скопируйте их, предоставив им третью @CaseIDCharlie. По сути, я объединяю данные для двух дел в один.

Вот код, иллюстрирующий ситуацию:

declare @merge table
(
    id int
)
declare @binding table
(
    id int identity,
    caseid int,
    personid int,
    organizationid int,
    serviceid int,
    durationid int,
    specialistid int,
    noteid int,
    dummy nvarchar(max)
)


insert into @binding
    (caseid, personid, organizationid, serviceid, durationid, specialistid, noteid, dummy)
values
    (1, 42, 42, 42, 42, 42, 42, 'overwrite me'), -- this should be overwritten
    (1, 86, 42, 42, 42, 42, 42, 'good data'), -- this should appear
    (2, 42, 42, 42, 42, 42, 42, 'good data'), -- this should appear
    (3, 42, 42, 42, 42, 42, 42, 'wrong case') -- this is a different case ID, should not appear

-- copy bindings to new case
delete @merge
insert into @merge select id from @binding where CaseID in (1,2) -- need to filter out duplicates by the other IDs
select b.* from @merge m join @binding b on m.id = b.id

Я хочу, чтобы таблица @merge содержала только идентификаторы. второй и третьей строк таблицы @binding. Первая строка должна быть пропущена, поскольку она является дубликатом третьей строки, а четвертая строка должна быть пропущена, поскольку она связана с идентификатором дела № 3, который не является одним из двух идентификаторов дела, которые мы объединяем.

Или, другими словами, вы могли бы сказать это так: я хочу что-то вроде select distinct personid, organizationid, serviceid, durationid, specialistid, noteid from @binding, но потом каким-то образом я бы также получил поля id и dummy из записи для случая 2, даже если они не совпадают между случаями 1 и 2 ...

Ответы [ 2 ]

2 голосов
/ 10 января 2020

IIU C - рассмотрите группировку агрегированных запросов по всем идентификаторам и возьмите макс. id:

insert into @merge 
select max(id)
from @binding
where caseid in (1,2)
group by personid, organizationid, serviceid, durationid, specialistid, noteid

Вывод

|    | id | caseid | personid | organizationid | serviceid | durationid | specialistid | noteid | dummy     |
|----|----|--------|----------|----------------|-----------|------------|--------------|--------|-----------|
| 1  | 2  | 1      | 86       | 42             | 42        | 42         | 42           | 42     | good data |
| 2  | 3  | 2      | 42       | 42             | 42        | 42         | 42           | 42     | good data |
0 голосов
/ 10 января 2020

Это зависит от того, какой порядок строк в таблице привязки вы считаете.

Типичный метод - использовать row_number (), а затем упорядочить по любым параметрам:

    insert into @merge 
    select id from 
    (
    select id, caseID,
      row_number() over(partition by caseid order by id desc) AS RowNr  
   --can define order by as necessary to get the most recent row
    from @binding 
    ) A
    where (RowNr = 1)
      and (CaseID in (1,2))

    select b.* from @merge m join @binding b on m.id = b.id

Если все, что вам нужно, это отсортировать по порядку загрузки в таблицу @Binding, тогда будет работать max (ID).

...