①IN
SELECT * FROM test_table WHERE aa IN (SELECT aa FROM (SELECT aa FROM test_table GROUP BY aa,bb,cc,dd HAVING COUNT(*) >= 2) AS X) --6.28 これでもできた。 SELECT * FROM test_table WHERE aa IN (SELECT aa FROM test_table GROUP BY aa,bb,cc,dd HAVING COUNT(*) >= 2)
IN句には複数の条件を記述することができます。
このsql文では、副問い合わせを行っている・・・のですが、副問い合わせの中で同じテーブルを使用するとエラーが出てしまうので、ASで別名をつけています。
書いていて思い出しました。
そのエラーが実際出るのかを試していません。
明日会社でやってみよう。
②ROW_NUMBER
SELECT aa,bb,cc,dd ,ROW_NUMBER() OVER(PARTITION BY aa,bb,cc,dd ORDER BY aa) AS 連番 FROM test_table
ROW_NUMBERは検索結果に順番をつけることができます。
ROW_NUMBER関数内にある、PARTITION BY でグループ化ができます。
③副問い合わせ
DELETE test_table FROM test_table AS C INNER JOIN ( SELECT aa,bb,cc,dd ,ROW_NUMBER() OVER(PARTITION BY aa,bb,cc,dd ORDER BY aa) AS 連番 FROM test_table ) AS A ON C.aa = A.aa AND C.bb = A.bb AND C.cc = A.cc WHERE 連番 <> 1
副問い合わせは、SELECT文による問い合わせを入れ子にすることです。
③はINNER JOINの中で副問い合わせを行っています。
同じテーブルで、JOINさせているのはROW_NUMBER(連番)をつけるためなのですが、これはまだあやふやなので試す必要があります。
6.28
なんとなくわかってきたような・・・
上司が先輩におっしゃっていたことなのですが、自分も覚えておかなければならないと思ったので書き残しておきます。
自分の行ったこと(書いたプログラムとか)が、今後他のところでどんな影響を受けるのか考えなさい。
自分が作業した後のことまで考えるのは難しいです。
これから少しずつできるようになればいいな・・・。