Как обновить столбец в таблице, используя объединения (с другой таблицей) с дублирующимися значениями в полях связывания - PullRequest
0 голосов
/ 02 мая 2019

У меня есть две таблицы: 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')

1 Ответ

0 голосов
/ 02 мая 2019

Обновление набора a.condition = b.condition FROM tableA внутренняя таблица соединений B b на a.Co_Id = b. Co_Id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...