Проблема с запросом SQL Server при обновлении таблицы - PullRequest
1 голос
/ 09 июля 2019

У меня есть две таблицы Table1 и Table2.

Я хочу обновить Table1 данными из Table2 в следующем формате.В разделенном запятыми значение, когда JobId одинаково:

Table1ColumnName Update = (Quantity * Length  [TYPE]  ---Table2 Column)

Table1

enter image description here

Table2

enter image description here

Ожидаемый результат будет очень похож на это:

enter image description here

Ответы [ 4 ]

0 голосов
/ 09 июля 2019

Пожалуйста, проверьте этот запрос, однако я предлагаю переосмыслить ваш подход, потому что хранить значение через запятую не очень хорошая идея:

Создание выборки данных

Declare @Table1 table(
CD_Contr_Type varchar(250), 
MainJob_Id varchar(100)
)
Insert into @Table1 values (NULL, '201900002')
Insert into @Table1 values (NULL, '201900004')
Insert into @Table1 values (NULL, '201900006')
Insert into @Table1 values (NULL, '201900008')
Insert into @Table1 values (NULL, '201900010')
Insert into @Table1 values (NULL, '201900012')
Insert into @Table1 values (NULL, '201900013')
Insert into @Table1 values (NULL, '201900015')

Declare @Table2 table(
MainJob_Id varchar(100),
Quantity decimal(5,3),
Length varchar(20),
Type varchar(100)
)
Insert into @Table2 values('201900002', 1.000, '20Feet', 'Flat Rate')
Insert into @Table2 values('201900004', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900004', 2.000, '40Feet', 'Bulk')
Insert into @Table2 values('201900006', 1.000, '20Feet', 'General Purpose')
Insert into @Table2 values('201900008', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900010', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900012', 1.000, '20Feet', 'High Cube')
Insert into @Table2 values('201900013', 1.000, NULL, 'Loose Cargo')
Insert into @Table2 values('201900015', 1.000, '20Feet', 'General Purpose')

Окончательное обновление запроса

Update A set CD_Contr_Type = UpdateVal from @Table1 A inner join (
Select MainJob_Id, 
(Select Cast(Cast(Quantity as int) as varchar) + ' * ' + Length + ' ' + Type + ', ' 
from @Table2 t2 
where t2.MainJob_Id = t1.MainJob_Id for XML Path('')) as UpdateVal 
from @Table1 t1 
group by MainJob_Id) B on A.MainJob_Id = B.MainJob_Id
0 голосов
/ 09 июля 2019

Попробуйте этот запрос:

update t1 set CD_ContrType = cast(t2.Quantity as varchar(10)) + '*' + t2.Length
from table1 t1
join table2 t2 on t1.MainJob_Id = t2.MainJob_Id
0 голосов
/ 09 июля 2019

Это, наверное, плохая идея. Обычно хранение значений, разделенных запятыми, не является хорошим подходом. Однако, если вы просто делаете это для целей презентации, это может быть не такой уж плохой идеей.

В SQL Server вы можете использовать FOR XML PATH для конкатенации строк:

update t1
    set cd_contrtype = t2.new_cd_contrtype
    from table1 t1 join
         (select t2.main_job_id,
                 stuff( (select concat(', ', tt2.quantity, ' * ', tt2.length, ' ', tt2.type)
                         from table2 tt2
                         where tt2.main_job_id = t2.main_job_id
                         for xml path ('')
                        ), 1, 2, ''
                      ) as new_cd_contrtype
          from (select distinct main_job_id from table2 t2) t2
          group by t2.main_job_id
         ) 
         on t2.main_job_id = t1.main_job_id
0 голосов
/ 09 июля 2019

Попробуйте этот код ниже. Помните, что ОБНОВЛЕНИЕ является рискованной операцией, и сначала попробуйте код с данными теста.

UPDATE A
SET A.CD_ContrType = CAST(@Quantity AS VARCHAR(MAX)) + ' * ' + Length + ' * ' + TYPE
FROM Table1 A
INNER JOIN Table2 B ON A.MainJob_id = B.MainJob_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...