Обновление таблицы SQL со значениями из разных строк само по себе - PullRequest
1 голос
/ 22 июля 2011

у меня есть стол

с 5 столбцами: -

  • Код страны
  • Язык
  • Складской
  • ActiveFrom
  • ActiveTo

Подмножество данных (извинения за несогласованность заголовков столбцов: -

Country
Code
   Language 
      Warehouse
                    ActiveFrom          ActiveTo
AT  de  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
AT  de  WGN 2011-02-14 00:00:00.000 9999-12-31 23:59:59.000
BE  fr  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000
BE  fr  WGN 2011-02-14 00:00:00.000 9999-12-31 23:59:59.000
CH  de  WGN 2011-02-14 00:00:00.000 9999-12-31 23:59:59.000
CZ  sk  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
CZ  sk  WGN 2011-02-14 00:00:00.000 9999-12-31 23:59:59.000
DE  de  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000
DE  de  WGN 2011-02-14 00:00:00.000 9999-12-31 23:59:59.000

Я хочу обновить столбец ActiveTo до значения даты ActiveFrom (дать или взять несколько миллисекунд) для того же хранилища.

Я пробовал это: -

update Translations
 set ActiveTo = DateAdd(ms, -3, ot.ActiveFrom)
    from Translations ot
   Where Warehouse = 'WGN'
     and CountryCode = ot.CountryCode

но, это дает эти результаты.

CountryCode Language    Warehouse   ActiveFrom  ActiveTo
AT  de  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
AT  de  WGN 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997
BE  fr  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000
BE  fr  WGN 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997
CH  de  WGN 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997
CZ  sk  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
CZ  sk  WGN 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997
DE  de  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000
DE  de  WGN 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997

Это обновляет правильные строки. Но значение неверное, оно вычитает 3 миллисекунды из собственной даты ActiveFrom вместо другой даты начала хранилища.

Этот SQL дает правильные результаты в производной таблице: -

select t.CountryCode, t.Warehouse, DateAdd (ms, -3, ot.ActiveFrom) as 'TransferToBHU', t.ActiveFrom, t.ActiveTo,
   ot.CountryCode, ot.Warehouse, ot.ActiveFrom, ot.ActiveTo
from Translations t
inner join Translations ot
  on ot.CountryCode= t.CountryCode

, где t.Warehouse = 'WGN' и ot.Warehouse = 'BHU' Заказ по t.CountryCode

    CountryCode Warehouse   TransferToBHU   ActiveFrom  ActiveTo    CountryCode Warehouse   ActiveFrom  ActiveTo
AT  WGN 2011-08-07 23:59:59.997 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997 AT  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
BE  WGN 2011-08-31 23:59:59.997 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997 BE  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000
CZ  WGN 2011-08-07 23:59:59.997 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997 CZ  BHU 2011-08-08 00:00:00.000 9999-12-31 23:59:59.000
DE  WGN 2011-08-31 23:59:59.997 2011-02-14 00:00:00.000 2011-02-13 23:59:59.997 DE  BHU 2011-09-01 00:00:00.000 9999-12-31 23:59:59.000

Теперь, если бы я мог получить вычисленное значение в TransferToBHU в значение обновления, это именно то, что я хочу.

Самое простое решение - обновить значения хранилища 'WGN' на основе значений 'BHU'. Тем не менее, лучшее будет обновляться на основе получения двух последних дат ActiveFrom для данного CountryCode.

Любое решение приемлемо, хотя, если кто-то предоставит решение, которое работает в указанные даты, он получит принятый ответ.

Заранее спасибо.

1 Ответ

2 голосов
/ 22 июля 2011
update t1
set ActiveTo = DateAdd(ms, -3, t2.ActiveFrom)
from Translations t1
   JOIN
   Translations t2 ON t1.CountryCode = t2.CountryCode
Where t1.Warehouse = 'WGN' AND t2.Warehouse = 'BHU'

Конечно, у страны CH нет строки BHU, поэтому:

update t1
set ActiveTo = DateAdd(ms, -3, ISNULL(t2.ActiveFrom,t1.ActiveFrom))
from Translations t1
   LEFT JOIN
   Translations t2 ON t1.CountryCode = t2.CountryCode
Where t1.Warehouse = 'WGN' AND t2.Warehouse = 'BHU'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...