2010-07-15 77 views
4

我想填充一個日期表,其中包含關於每一天的信息的下一個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 

無論如何,我可以用一個類似的查詢時間更新我的約會表中的一個字段:

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

是否有更好的方法來一次更新多個字段?我不知道我怎麼能這樣做,因爲我沒有加入。

+1

請勿在格式化代碼時使用選項卡。 – 2010-07-15 21:01:54

+0

@Chadwick:Thx糾正格式! – 2010-07-15 21:40:14

+0

對不起,我沒有使用製表符,我從Excel電子表格中複製並粘貼了它。 – DavidStein 2010-07-15 21:52:26

回答

4

這聽起來像你想更新表對每一個最新記錄。答案假設。如果你能保證你的數據源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 

如果你有興趣,這裏有一個proof of concept on some test data

+0

謝謝,我會試試看。我無法檢查概念證明,因爲我的公司阻止了該網站。 – DavidStein 2010-07-16 18:32:36

+1

@大衛 - 也許這個網站沒有被封鎖 - http://www.copypastecode.com/32817/ – 2010-07-16 19:07:37

1

您可以隨時在您的更新查詢中設置更多的領域:

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

是的,我明白這一點。我希望以此爲基礎的一套基於處理方式。 – DavidStein 2010-07-15 21:51:50

1

也許循環你的日期表是一個解決方案?

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