使用另一个表中的约束值更新表

时间:2013-06-07 13:25:20

标签: sql-server tsql

我是SQL的新手,现在尝试解决这个问题大约两天,但无济于事。

问题是,如何从表2中的值更新表Table_1中的值,仅考虑表2中的特定行子集,如果可能,不使用游标。

更具体地说,我有这两个表:

CREATE TABLE [dbo].[Table_1](
    [ID] [int] NOT NULL,
    [LastAmount] [int] NOT NULL,
    [LastDate] [datetime] NOT NULL
) ON [PRIMARY];

CREATE TABLE [dbo].[Table_2](
    [ID] [int] NOT NULL,
    [Amount] [int] NOT NULL,
    [Date_] [datetime] NOT NULL
) ON [PRIMARY];

在表格中有以下值:

INSERT INTO [dbo].[Table_1]
    VALUES (1, 0, CONVERT(DATETIME, '19000101', 112)),
           (2, 0, CONVERT(DATETIME, '19000101', 112));

INSERT INTO [dbo].[Table_2]
    VALUES (1, 10, CONVERT(DATETIME, '19750101', 112)),
           (1, 20, CONVERT(DATETIME, '19500101', 112)),
           (1, 15, CONVERT(DATETIME, '20000101', 112)),
           (2, 30, CONVERT(DATETIME, '20100101', 112));

重点是更新Table_1中ID与Table_2匹配的值。 Table_1.LastAmount应该使用最新的Table_2.Date_获取Table_2.Amount。类似地,对于Table_1.LastDate,它应该得到Table_2.Date_,其中日期是该特定ID的最新日期。

所以,更新前的表_1:

ID  |LastAmount |LastDate
----|-----------|--------
1   |0          |1900-01-01 00:00:00.0000
2   |0          |1900-01-01 00:00:00.0000

TABLE_2:

ID  |Amount     |Date
----|-----------|--------
1   |10         |1975-01-01 00:00:00.0000
1   |20         |1950-01-01 00:00:00.0000
1   |15         |2000-01-01 00:00:00.0000
2   |30         |2010-01-01 00:00:00.0000

更新后的表_1:

ID  |LastAmount |LastDate
----|-----------|--------
1   |15         |2000-01-01 00:00:00.0000
2   |30         |2010-01-01 00:00:00.0000

我尝试使用INNER JOIN进行各种UPDATE,或者在分配值时使用内联SELECT,但它们都没有工作。非常感谢提前。

3 个答案:

答案 0 :(得分:0)

这样做:

Update Table_1
Set LastAmount = Table_2.Amount,
LastDate = Table_2.[Date_]
from (SELECT ID, MAX([Date_]) as MaxDate FROM TABLE_2 GROUP BY ID) AS Max_Table2
inner join Table_2 on Max_Table2.MaxDate = Table_2.[Date_] and Max_Table2.id = Table_2.id
inner join table_1 on table_1.id = Table_2.id

基本上你已经过滤了table2以获得最大日期并加入所有内容以找到lastdate和amount。

答案 1 :(得分:0)

这是一个简单的ROW_NUMBER()和CTE用法:

;With Ordered as (
    select ID,Amount,Date_,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date_ DESC) rn
    from Table_2
)
update t1
set LastAmount = o.Amount,
LastDate = o.Date_
from
  Table_1 t1
    inner join
  Ordered o
    on
      t1.ID = o.ID and
      o.rn = 1

(你可以把它写成子查询而不是CTE,但我在这个例子中选择了一个CTE)

答案 2 :(得分:0)

update from在这种情况下非常有用。此处使用row_number()和源表来确定Table_2中的最新条目。

update
    Table_1
set
    LastAmount = T2.Amount
    ,LastDate = T2.Date_
from
    (
        select
            ID
            ,Amount
            ,Date_
            ,row_number() over (partition by ID order by Date_ desc) as RowNumber
        from
            Table_2
    ) T2
where
    Table_1.ID = T2.ID
    and T2.RowNumber = 1
相关问题