2010-06-28 43 views
1

日期范围的更新行我有看起来像这样的如何在Teradata的

accounts 
account_number integer 
date_updated_last datetime 
delinquency_code varchar(3) 

payments 
account_number integer 
statement_date datetime 
delinquency_code varchar(3) 

拖欠代码列在帐户填充的Teradata数据库的两个表,但在支付不填充。我想用基于date_updated_last和statement_date的拖欠代码更新付款。问题是,statement_date是连续的,比如一个给定的账户在2009年7月开放,那么在当时和现在之间每个月都会有一个记录,但是只有当信息改变时才添加账户记录,所以可能存在例如,同一个帐户的帐户表中只有3条记录。说,2009年8月,2010年1月和2010年3月。所以我想更新2009年8月到2010年1月之间的所有付款记录与2009年8月帐户记录中的数据。任何人都可以点我一个简单的方法来做到这一点?

谢谢:)

-C

回答

3

好吧,这里是另一个尝试在Teradata的语法:

UPDATE 
    Payments 
FROM 
    (
     SELECT 
      A1.account_number, 
      A1.date_updated_last AS begin_date, 
      A2.date_updated_last AS end_date, 
      A1.delinquency_code 
     FROM 
      Accounts A1 
     INNER JOIN Accounts A2 ON 
      A2.account_number = A1.account_number AND 
      A2.date_updated_last > A1.date_updated_last 
     WHERE 
      NOT EXISTS 
      (
       SELECT * 
       FROM 
        Accounts A3 
       WHERE 
        A3.account_number = A1.account_number AND 
        A3.date_updated_last > A1.date_updated_last AND 
        A3.date_updated_last < A2.date_updated_last 
      ) 
    ) AS SQ (account_number, begin_date, end_date, delinquency_code) 
SET 
    delinquency_code = SQ.delinquency_code 
WHERE 
    account_number = SQ.account_number AND 
    statement_date >= SQ.begin_date AND 
    statement_date < SQ.end_date 
+0

什么A是SET语句? – 2010-06-28 16:40:19

+0

对不起,改正了。我以A作为表别名开始,然后在SET部分中更改它而不更改它。 – 2010-06-28 16:44:27

+0

这似乎确实起作用。 thx汤姆:) – 2010-06-28 17:59:12