У меня есть две таблицы: A и B. A имеет пять столбцов, а именно Co_ID, MODE, Ship_date, SCAC, BU, Condition
B имеет следующие столбцы: Co_ID, Mode, Condition
Пример данных в A такой, как показано ниже:
Co_ID MODE Ship_date SCAC BU Condition
XYZ DV 10/5/2018 CEDD XYZ
XYZ DV 10/6/2018 CEDD XYZ
XYZ DV 10/6/2018 NAFQ XYZ
XYZ DV 10/7/2018 ABCD XYZ
XYZ DV 10/7/2018 PQRS XYZ
XYZ TC 10/4/2018 BLKW XYZ
XYZ TC 10/7/2018 BLKW XYZ
XYZ TC 10/7/2018 ABCD XYZ
XYZ TC 10/8/2019 PQRS XYZ
Образцы данных в B приведены ниже:
Co_ID Mode Condition
XYZ DV A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac Not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC A.Co_id = 'XYZ' and TransactionData_TL.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
Цель: обновить столбец условий в таблице A, используя столбец условий в таблице B, связывающий столбцы Co_ID и mode.
Проблема, с которой я сталкиваюсь: Столбец условия в таблице A обновляется неправильно, что означает, например, все строки (строки с 1 по 5) с Co_ID = 'XYZ' и mode = 'DV' в таблице A ошибочно обновляется до первого значения столбца условия с Co_ID = 'XYZ' и mode = 'DV' (строка 1), а не с соответствующими значениями условий таблицы B. Я не могу понять, где находится точная проблема .
Я использовал запрос на основе курсора для обновления столбца условия в таблице A до столбца условия в таблице B, связывающего столбцы Co_ID и mode и предоставляющего столбец условия в предложении where, как показано ниже:
Declare @sql_program nvarchar(max), @sql nvarchar(max)
Set @sql_program=''
Set @sql=''
Declare CONDITION_CURSOR Cursor for
Select 'Update A
Set A.Condition = B.Condition
From A inner join B
on A.Co_ID = B.Co_ID and A.mode = B.mode ' + ' and ' +
CASE WHEN (LTRIM(RTRIM(B.Condition)) is null) THEN '' ELSE (LTRIM(RTRIM(B.Condition))) END
From B
Open CONDITION_CURSOR
Fetch next from CONDITION_CURSOR into @sql_program
While(@@FETCH_STATUS!=-1)
Begin
If(@sql_program is not null)
Begin
If(@sql is null or @sql = '')
Begin
Set @sql = @sql_program
End
Else
Begin
Set @sql = @sql + ' ; '+ @sql_program
End
end
Fetch next from CONDITION_CURSOR into @sql_program
End
Close CONDITION_CURSOR
Deallocate CONDITION_CURSOR
Select @sql as Condition_query
EXEC sp_executesql @sql
Ожидаемый результат должен быть таким, как показано ниже:
Co_ID MODE Ship_date SCAC BU Condition
XYZ DV 10/5/2018 CEDD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW')and A.BU in('XYZ')
XYZ DV 10/6/2018 CEDD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/6/2018 NAFQ XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/7/2018 ABCD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac Not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/7/2018 PQRS XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac Not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/4/2018 BLKW XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/7/2018 BLKW XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/7/2018 ABCD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/8/2019 PQRS XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac not in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
Фактический вывод, который я получаю в данный момент, следующий:
Co_ID MODE Ship_date SCAC BU Condition
XYZ DV 10/5/2018 CEDD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/6/2018 CEDD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/6/2018 NAFQ XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/7/2018 ABCD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ DV 10/7/2018 PQRS XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('DV') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/4/2018 BLKW XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/7/2018 BLKW XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/7/2018 ABCD XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')
XYZ TC 10/8/2019 PQRS XYZ A.Co_id = 'XYZ' and A.Ship_date>='2018-10-01' and A.Ship_date<='2018-12-31' and A.mode in('TC') and A.Scac in('CEDD','NAFQ','BLKW') and A.BU in('XYZ')