2

私はSQLにかなり慣れていないので、この問題を約2日間解決しようとしましたが、役に立ちませんでした。

問題は、可能であればカーソルを使用せずに、Table_2 の特定の行のサブセットのみを考慮して、Table_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));

ポイントは、ID が Table_2 と一致する Table_1 の値を更新することです。Table_1.LastAmount は、最新の Table_2.Date_ で Table_2.Amount を取得する必要があります。同様に、Table_1.LastDate の場合、日付がその特定の ID の最新のものである Table_2.Date_ を取得する必要があります。

したがって、更新前の Table_1:

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

表 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

更新後の Table_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 を使用したりしましたが、どれも機能しませんでした。よろしくお願いします。

4

3 に答える 3

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 と金額を見つけます。

于 2013-06-07T13:30:48.960 に答える