Обновление одной таблицы из другой без отношения один к одному - PullRequest
4 голосов
/ 16 июля 2010

Я пытаюсь заполнить таблицу дат, которая содержит каждую дату на следующие 35 лет, информацией о каждом дне.

В моей системе ERP есть таблица учетных лет (GLRULE), в которой указываются отчетные периоды для каждого конкретного года, поскольку многие компании не работают в календарных месяцах.

Таблица GLRule содержит одну запись для каждого периода и выглядит так:

fcbasis  fcname    fcstatus  fdend              fdstart            flisadjust  flisaudit  fnnumber  freval  identity_column
A        FY 2000   C         1/28/2000 0:00:00  1/1/2000 0:00:00   FALSE       FALSE      1         FALSE   37
A        FY 2000   C         2/25/2000 0:00:00  1/29/2000 0:00:00  FALSE       FALSE      2         FALSE   38
A        FY 2000   C         3/31/2000 0:00:00  2/26/2000 0:00:00  FALSE       FALSE      3         FALSE   39
A        FY 2000   C         4/28/2000 0:00:00  4/1/2000 0:00:00   FALSE       FALSE      4         FALSE   40
A        FY 2000   C         5/26/2000 0:00:00  4/29/2000 0:00:00  FALSE       FALSE      5         FALSE   41
A        FY 2000   C         6/30/2000 0:00:00  5/27/2000 0:00:00  FALSE       FALSE      6         FALSE   42

В любом случае, я могу обновить свою таблицу дат по одному полю за раз с помощью запроса, подобного следующему:1008 *

UPDATE redfridaydates.dbo.testdates 
   SET [FISCAL_PERIOD]   = 
                (SELECT fnnumber
                  FROM m2mdata01..glrule GLR
                  where DATE >= GLR.FDSTART and DATE <= GLR.FDEND)

Есть ли лучший способ обновить несколько полей одновременно?Я не уверен, как я могу это сделать, так как у меня нет соединения.

Ответы [ 3 ]

4 голосов
/ 16 июля 2010

Похоже, таблица, которую вы пытаетесь обновить, имеет одну запись на каждую дату. Ответ предполагает это. Если вы можете убедиться, что ваш источник данных GL не имеет перекрывающихся дат:

UPDATE T
SET T.[FISCAL_PERIOD] = GLR.fnnumber,
     T.Foo = GLR.Bar,
     T.Bat = GLR.Baz  --etc.

FROM redfridaydates.dbo.testdates  AS T
INNER JOIN m2mdata01..glrule AS GLR
ON T.[Date] BETWEEN GLR.FDSTART  AND GLR.FDEND

Если вам интересно, вот подтверждение концепции на некоторых тестовых данных .

1 голос
/ 16 июля 2010

Может быть, решение вашей таблицы дат будет решением?

declare @myDate SmallDateTime
set @myDate = (Select MIN(DATE) FROM dbo.testdates)

declare @myFiscal int

WHILE @myDate is not null
BEGIN

--determine the fiscal period
--output a zero for missing fiscal periods
SET @myFiscal = isnull(
   (
   SELECT fnnumber 
   FROM m2mdata01..glrule GLR 
   WHERE @myDate >= GLR.FDSTART AND @myDate <= GLR.FDEND
   ),0)

--update the date table
UPDATE redfridaydates.dbo.testdates 
SET fiscal_period = @fiscal
WHERE date = @myDate

--get the next date
--will be null once the loop reaches the end of the table
SET @myDate = (Select MIN(DATE) FROM dbo.testdates WHERE DATE > @myDAte)

END
1 голос
/ 16 июля 2010

вы всегда можете установить больше полей в запросе на обновление:

UPDATE TableName Set Field1 = (Select fnnumber From ....), 
Field2 = (some other query or value), etc.
...