• ベストアンサー

あるカラムに同じ値を持つレコードの2件目以降を削除

あるカラムに同じ値を持つレコードの2件目以降を削除するSQLを教えて下さい。 例) テーブル名:T キーカラム名:K 同じ値を持つかチェックするカラム名:S SELECT K,S FROM T; K S ---- 1 a 2 b 3 b 4 c 5 d 6 e 7 e 上記の場合、K=2または3と、K=6または7の2レコードを削除したい。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

2件目以降とはどういう条件で判断するのでしょうか。 >K=2または3と、K=6または7 とありますが、Sが重複しているレコードのうちどれでもいいということですか? とりあえず、Sが重複していてKが一番小さいレコードのみを残すSQLであれば delete from T a where exists ( select * from T b where a.S = b.S and a.K > b.K); という感じになると思います。 提示のデータであれば、Kが3、7のレコードを削除します。 やりたいことと違うようであれば、もう少し具体的に条件を提示してください。

yayaman6437
質問者

お礼

お礼が遅くなり失礼しました。ご回答いただいたSQLを実際に実行し、「exists」の解説を調べ理解できました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

delete from T where exists ( select 1 from T T2 where T.K>T2.K and T.S=T2.S )

yayaman6437
質問者

お礼

お礼が遅くなり失礼しました。ご回答いただいたSQLを実際に実行し、「exists」の解説を調べ理解できました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#212058
noname#212058
回答No.1

使用しているデータベースの製品によって書き方が変わります。 データベースがわからないと回答できません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 複数のレコードの値を取り出すには

    初心者です。あるカラムから複数のレコードの値を取り出すにはどのように書けばよいかどなたか教えていただけますでしょうか。 下記のコードではcalendartblというテーブルから1レコードのみ取り出せます。 テーブル:calendartbl holiday(カラム名) 2016/9/12(レコード1行目) 2016/9/14(レコード2行目) 2016/9/20(レコード3行目) 2016/9/26(レコード4行目) 2016/9/28(レコード5行目) コード: $sql = "SELECT calendartbl.holiday FROM calendartbl"; $ret = f_db_select($sql); foreach ($ret as $h){ $holiday = $h['holiday']; } 結果=2016/9/12 では複数のレコード、つまり「2016/9/12、2016/9/14、2016/9/20、2016/9/26、2016/9/28」を取り出して、上記の$holidayに代入させるにはどのように書けばよいでしょうか。 どなたか教えて頂けたら幸いです。 よろしくお願い致します。

    • 締切済み
    • PHP
  • SQLiteで最も古いレコードのみの削除

    AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • 1つのカラムに複数レコードの値を・・・

    お世話になります。 SQL文の作成に難航しています。 どうか知恵を貸してください。 環境:VS2005 Oracl10g 言語:VB.Net A_TABAL NO |GroupNO| 1 |A_1 1 |A_1 1 |A_1 B_TABAL NO |K_NO|K_N 1 |K_1 |項目名1_あ 1 |K_1 |項目名1_い 1 |K_2 |項目名2_あ 1 |K_1 |項目名1_う 1 |K_2 |項目名2_あ 1 |K_2 |項目名2_あ AテーブルとBテーブルのNOが一致するもので、K_NOがK_1であれば、 項目名1というカラムにいれる。 (複数の場合はカンマ区切りでいれる) K_NOがK_2であれば、項目名2というカラムにいれる。 (Bテーブルでは K_1とK_2のレコード数は同じ、実際とってくるときは、NOが同じであれば、重複なものは消すと) 求めたい結果 NO |GroupNO  |項目名1               |項目名2 1  |A_1     |項目名1_あ,項目名1_い,項目名1_う|項目名2_あ

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • 異なるテーブルのレコード削除

    オラクル初心者です。宜しくお願いします。 AAA、BBB、CCCというテーブルがあると仮定します。 画面から入力された値(ddd)をキーとして、CCCテーブルから該当するレコードをセレクト文で引っ張り、eeeという値を抜き出したとします。 そのeeeという値をキーにAAA、BBBテーブルのレコードを削除するにはどういうSQLを発行すればよろしいでしょうか? "delete from AAA, BBB where eee = (select eee from CCC where fff = ddd);" では駄目でした。 質問が下手でわかりにくいかもしれませんが、どうかご教授お願いします。

  • 値が「1」のカラム名を求めたい。

    任意の列の、値が「1」のカラム名を求めるにはどうしたらいいでしょうか? PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 そもそものテーブルの作り方がおかしいのかも知れませんが、 以下のようになっています。 このテーブルで、IDが「40」の列の値が「1」のカラム名を求めたいのです。 どの様にしたらいいでしょうか? ※カラム名「会員番号110」は実際は整数になっています。 ID  会員番号110  会員番号111  会員番号112  会員番号113  40  1       1       0       1       41  0       1       1       1   $sql ="select * from `member_sub_tbl` where `ID`='$ID'"; $result = mysql_query($sql, $con); //カラムの数を取得する $numFields = mysql_num_fields($result); for($i=0;$i<$numFields;$i++){ $nameFields[] = mysql_field_name($result, $i); } print_r($nameFields); これで、カラム名は全て配列に入るのですが、値が「1」のと限定する方法がわかりません。 ご教授、よろしくお願いいたします。    

    • ベストアンサー
    • PHP
  • 複数のテーブルからデータを取得したい

    1つのテーブルから重複したデータを取り除いて表示するときに使う 【select distinct カラム名 from テーブル名;】 がありますよね。 それと同じようなことを複数のテーブルをまたいで行いたいのですがうまくいきません。 ちなみに両方のテーブルのカラム名は同じです。 【select distinct カラム名 from テーブル1 union select distinct カラム名 from テーブル2;】 としても重複を取り除いた後にテーブルを結合してるので結果的に両テーブルの重複した値を取り除くことができず。 そこで 【select distinct T1.カラム名, T2.カラム名 from テーブル1 T1. テーブル2 T2;】 としてみたのですが、クエリを実行中のまま反応がないので悩んでます。 ちなみに2つのテーブルのデータはそれぞれ2万件ほどです。 こういう時どういうsql文を組むのが正しいのでしょうか?

    • ベストアンサー
    • MySQL
  • postgresqlにて全レコードのupdate

    PostgreSQLの全レコードを順次Updateしたいのですが、 SQLの記述方法がわかりません。 [やりたいこと] ユーザ情報を保持しているテーブルに、新しく"ID_TMP"カラムを追加。 カラム"ID_TMP"に、ユーザIDを保持しているカラム"ID_INFO"の内容を書き込む。 コピーしたいレコードが単一の場合、次のSQLで可能だと思うのですが、 テーブルに保持している全レコードを順次処理する方法を教えてください。 update [テーブル名] set ID_TMP = (select ID from [テーブル名] where id = [ID名]); 宜しくお願いいたします。

  • selectの内容によって、登録するカラムを変えたい

    selectの内容によって、登録するカラムを変えたい selectであるテーブルからある値Aをとってきます。 値Aが1の時は別テーブルの金額1に登録、2の時は金額2に登録、3の時は金額3に登録 という処理を行いたいです。 同一レコードに対して複数の金額がある事があります。 テーブル1(取得テーブル) ------------------ キー 値A 金額 1   1  500 1   3  300 2   3  200 ------------------ テーブル2(登録テーブル) ------------------ キー 金額1 金額2 金額3 1   500  0  300 2    0  0  200 ------------------ いま、 insert into テーブル2 SELECT 項目 from テーブル1 というように1つのSQLで、登録、削除をしようとしていますが 可能でしょうか?。方法がよく分かりません。