Обновление в зависимости от длины поля в другой таблице - PullRequest
0 голосов
/ 25 февраля 2020

Мне нужно обновить столбец в таблице в зависимости от длины данных столбца в другой таблице.

Таблицы:

SOURCE:
Item_Group    Name
------------|-----------
1000        | Joe
1001        | Jill
1002        | Joanna
222222      | James
333333      | John

DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    |
1001        | 000002    |
9998        | 222222    |
9999        | 333333    |


UPDATED DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    | Joe
1001        | 000002    | Jill
9998        | 222222    | James
9999        | 333333    | John

Обновление должно основываться на длине данных Item_Group. Если длина данных равна 4, обновление должно выполняться на основе Item, Если длина данных равно 6, обновление должно выполняться на основе Group.

У меня есть два отдельных запроса, которые, как я считаю, выполняют функцию.

UPDATE table_dest
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Item
AND DATALENGTH(a.Item_Group) = 4
GO

UPDATE table_dest 
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Group
AND DATALENGTH(a.Item_Group) = 6
GO

Как это делается в одном запросе?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Вы можете использовать apply:

UPDATE dt 
     SET dt.Person = s.Name
FROM table_dest dt CROSS APPLY
     ( VALUES (dt.Item), (dt.[Group]) 
     ) dtt(ItemGroup) INNER JOIN
     table_source s
     ON s.Item_Group = dtt.ItemGroup;
0 голосов
/ 25 февраля 2020

Попробуйте это.

UPDATE b SET PERSON=nAME
FROM #tempDESTINATION B 
cross apply ( 

    select * from #tempSOURCE A where a.Item_Group = b.Item and DATALENGTH(a.Item_Group)=4
    UNION
    select * from #tempSOURCE A where a.Item_Group = b.Destgroup and DATALENGTH(a.Item_Group)=6
) Name1 
0 голосов
/ 25 февраля 2020
CREATE TABLE #tempSOURCE(Item_Group INT,NAME VARCHAR(50))
INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1000,'Joe')
INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1001,'Jill')
INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1002,'Joanna')
INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(222222,'James')
INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(333333,'John')

CREATE TABLE #tempDESTINATION(Item INT,Destgroup INT,Person VARCHAR(50))
INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(1000,000001,'')
INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(1001,000002,'')
INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(9998,222222,'')
INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(9999,333333,'')

SELECT * FROM #tempSOURCE

SELECT * FROM #tempDESTINATION



UPDATE b 
SET b.Person= CASE WHEN a.Item_Group=b.Item THEN a.Name ELSE 
              CASE WHEN  b.Destgroup=a.Item_Group THEN a.Name END END 
FROM #tempSOURCE a inner join #tempDESTINATION b
ON a.Item_Group=b.Item
OR  b.Destgroup=a.Item_Group


SELECT * FROM #tempDESTINATION

enter image description here

Примечание: - здесь я использую .. in #tempDESTINATION Имя столбца группы рассылки вместо Group ..because. .Group - зарезервированное ключевое слово ...

здесь я использую соединение ... вместо проверки длины данных столбца .. вы получите вывод

...