我是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,但它们都没有工作。非常感谢提前。
答案 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