1

SQL の基本的な知識はありますが、大量のデータを処理するために SQL を使用する必要があります。これが私の問題です:

次のように、2つのテーブルがあります。

table1:
id    begin    end
100   1998     2013
101   1996     2009

table2:
id    date     price    qtt
100   1996     10       200
100   1999     12       200
101   1997     13       100
101   2013     14       100

私がする必要があるのは、フィールドdateより小さいか、各 IDより大きい行を消去することです。つまり、101 の場合、1996 年以前または 2009 年以降の日付を持つレコードはありません。begindateendid

だから私の意図した結果は次のとおりです。

id    date     price    qtt
100   1999     12       200
101   1997     13       100

数百万のレコードを持つテーブルに対してこれを行っているため、効率が懸念されます。簡単にできるように、これらのテーブルを使用して sqlfiddle を用意しました。

http://sqlfiddle.com/#!2/66f54f/1

この質問が単純すぎて申し訳ありませんが、3時間検索した後、自分で解決できませんでした. 前もって感謝します!

4

2 に答える 2

3

やりたいことの標準SQL構文は次のとおりです。

delete from table2
    where not exists (select 1
                      from table1
                      where table1.id = table2.id and
                            table2.date between table1."begin" and table1."end"
                     );

idが に存在するが に存在しtable2ない場合table1、そのすべての行idが削除されることに注意してください。

にインデックスがある場合、これはほとんどのデータベースで非常に効率的ですtable1(id, date)

于 2014-03-18T20:50:39.820 に答える