2

以下のような2つのテーブルがあります。

TABLE_A

START_DT END_DT 値

1993/4/1 1993/4/29 48
1993/4/29 1993/5/12 48
1993/5/13 1993/5/27 44
1993/5/27 1993/8/18 44

TABLE_B

START_DT END_DT 値

1993 年 4 月 1 日 1993 年 5 月 12 日 NULL
1993 年 5 月 13 日 1993 年 8 月 18 日 NULL

ご覧のとおり、TABLE A の最初の 2 行の日付範囲は、TABLE B の最初の行の日付範囲にあります。表 A の行 3 と行 4 の日付範囲は、表 B の行 2 に含まれます。

日付範囲に基づいて、A.VALUE を取得し、TABLE B が次のように表示されるように B.VALUE を更新します。

TABLE_B

START_DT END_DT 値

1993 年 4 月 1 日 1993 年 5 月 12 日 48

1993 年 5 月 13 日 1993 年 8 月 18 日 44

カーソルを使用してこれを実行し始め、テーブル A を調べて、A.START_DT と A.END_DT がテーブル B の範囲内にあるかどうかを確認し、それに応じて更新します。

基本的、

DECLARE @StartDate datetime, @EndDate datetime, @Value smallint; DECLARE MyCursor cursor for select * from TABLE_A

OPEN MyCursor FETCH NEXT FROM MyCursor INTO @StartDate,@EndDate, @Value //次に、何かをしたい:

//  SELECT START_DT, END_DT
//      FROM TABLE_B
//      WHERE START_DT <= A.@EndDate
//      AND END_DT>= A.@StartDate
//
//

//ここから、TABLE B の VALUE 列を更新する最善の方法について混乱しています。

UPDATE TABLE B
    SET VALUE = @Value

WHERE B.START_DT,B.END_DT in (
    SELECT start_dt,end_dt
        FROM TABLE_B
        WHERE start_dt <= @EndDate
        AND end_dt >= @StartDate)

上記は正しい構文ではありませんが、要点はわかります。誰かがこれを行う/修正するための迅速で汚い方法を持っていますか? 日付範囲に基づいて作業したい行を選択し、単一の VALUE 列を更新する SQL を作成する方法について頭が固まります。

カーソルを使わずにこれを行う簡単な方法はありますか?

よろしくお願いします。

4

1 に答える 1

2

次のコードを試して値を更新してください。カーソルを完全に回避してこれを使用できます

UPDATE B
SET B.VALUE = V.VALUE
FROM TABLE_B B 
CROSS APPLY (SELECT DISTINCT VALUE FROM TABLE_A A 
              WHERE B.start_dt <= A.End_dt AND B.end_dt >= A.Star_Dt) V
于 2013-01-18T22:30:17.257 に答える