2017-02-22 31 views
0

field_indの値をYに更新するために、selectステートメントを更新ステートメントに変換するときに助けが必要です。table_1の主キーはfield_id,create_dateです。ここで私は更新する必要があるレコードを見つけるために使用されるSELECT文は次のとおりです。更新のステートメントを作成するヘルプ(保留中)

SELECT cd.field_id, cd.create_date, cd.field_ind FROM table_1 cd 
    JOIN table_2 ct 
    ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
    ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
WHERE cd.create_date IN (SELECT MAX(create_date) 
          FROM table_1 
          WHERE field_id = ct.field_id); 

サンプルデータ:

FIELD_ID CREATE_DATE FIELD_IND 
    123 1/1/2016   N 
    123 2/1/2017   N 
    456 1/1/2016   N 
    456 3/1/2017   N 
    789 1/1/2015   N 
    789 1/31/2017   N 

期待される結果:

FIELD_ID CREATE_DATE FIELD_IND 
    123 1/1/2016   N 
    123 2/1/2017   Y 
    456 1/1/2016   N 
    456 3/1/2017   Y 
    789 1/1/2015   N 
    789 1/31/2017   Y 

すべてのヘルプ高く評価しました。ありがとう。

+0

どこに更新しますか?サンプルデータと期待される結果は、あなたが意味するものを明確にするのに役立ちます。 –

+0

table_1のfield_indを更新します。 – user3224907

+0

しかし何に?クエリはその列を取得します。既に値を更新したいのですか?または、IDのすべての行を更新して、そのIDの最新の作成日の行の値と同じ値にしたいとしますか? –

答えて

0

あなたが更新のみで日付を作成含めるようにErsinのアプローチのマイナーな変化を必要とする:

UPDATE table_1 
SET field_ind = 'Y' 
WHERE (field_id, create_date, field_ind) IN (
    SELECT cd.field_id, cd.create_date, cd.field_ind FROM table_1 cd 
    JOIN table_2 ct 
     ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
     ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
    WHERE cd.create_date IN (SELECT MAX(create_date) 
           FROM table_1 
          WHERE field_id = ct.field_id) 
); 

3 rows updated. 

select * from table_1 order by field_id, create_date; 

    FIELD_ID CREATE_DAT F 
---------- ---------- - 
     123 2016-01-01 N 
     123 2017-02-01 Y 
     456 2016-01-01 N 
     456 2017-03-01 Y 
     789 2016-01-01 N 
     789 2017-01-31 Y 

は基本的にあなたがあなただけで識別される行をしたい場合は、キーフィールドの両方で更新を相関させる必要がありを更新されるクエリ。 (これは以前のサンプルデータ/結果からはっきりとは分かりませんでしたが、Ersinの答えはあなたが示したものではなく、今説明した状況では役に立ちませんでした)。field_indを含める必要はありませんが、クエリ私はIN句にそれを含めました - それは両方から削除することができます。

あなたはあなたの最初のクエリでサブクエリを取り除き、したがって、わずかのようなもので、あまりにも更新を簡素化し得る可能性があります。同じ3行を更新

UPDATE table_1 
SET field_ind = 'Y' 
WHERE (field_id, create_date) IN (
    SELECT cd.field_id, 
     max(cd.create_date) keep (dense_rank last order by create_date) 
      as create_date 
    FROM table_1 cd 
    JOIN table_2 ct 
     ON cd.field_id = ct.field_id 
    AND cd.field_ind = 'N' 
    JOIN table_3 c 
     ON c.field_id = cd.field_id 
    AND c.field_rpt = 'N' 
    GROUP BY cd.field_id 
); 

。私はそれがあなたが示した参加条件に基づいて、ここに相当すると思います。

関連する問題