【無料配信♪】Renta !全タテコミ作品第1話

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

このQ&Aに関連する最新のQ&A

SQL 抽出」に関するQ&A: SQL抽出順番

A 回答 (2件)

select * from `test`


where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)
    • good
    • 11

SELECT * FROM


(SELECT a, b, COUNT(*) AS CNT FROM test GROUP BY a,b)
WHERE CNT > 1

とすれば、重複するキーの値を求められるので、後は、複数のレコードを認識できる項目とあわせて削除すればよいと思います。
    • good
    • 9

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q重複データの抽出方法(複数項目)

以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。

a列|b列|c列|d列
---|---|---|---
01 |01 |01 |01
02 |01 |01 |01
03 |02 |01 |03
04 |02 |02 |03
05 |01 |01 |02
06 |02 |02 |03

select * from テスト
where c in (select c from テスト group by c,d having count(*)>1)
and d in (select d from テスト group by c,d having count(*)>1)

そうしたところ、以下の結果になってしまいました。
想定では、○のレコードだけ抽出できると思ったのです。
×のレコードを抽出したくないのですが、SQLのどこが
間違っているのでしょうか?

a列|b列|c列|d列
---|---|---|---
01 |01 |01 |01 ○
02 |01 |01 |01 ○
03 |02 |01 |03 ×
04 |02 |02 |03 ○
06 |02 |02 |03 ○

(使用DB)SQLServer2000

以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。

a列|b列|c列|d列
---|---|---|---
01 |01 |01 |01
02 |01 |01 |01
03 |02 |01 |03
04 |02 |02 |03
05 |01 |01 |02
06 |02 |02 |03

select * from テスト
where c in (select c from テスト group by c,d having count(*)>1)
and d in (select d from テスト group by c,d having count(*)>1)

そうしたところ、以下の結果になってしまいました。
想定では、○のレコードだけ抽...続きを読む

Aベストアンサー

>SQLのどこが間違っているのでしょうか?

最初の条件では、c列の値が01、02がヒットします。
二つ目の条件では、d列の値が、01、03がヒットします。
これにより、c列=01 & d列=03の行もヒットしてしまいます。
つまり、c列の値とd列の値の組で、「2件以上あるもの」という条件になっていません。

以下にSQL例を示します。

select * from t1 x
where exists
(select * from t1 where x.c=c and x.d=d group by c,d having count(*)>1)

Q重複しているデータを取得したい

[TBL_TEMP]
ID 年月1  年月2 項目A  項目B
--------------------------------------------
1 200909 200910 aaaa bbbb
2 200807 200809 aaaa bbbb
3 200909 200910 aaaa bbbb
4 200909 200909 aaaa bbbb
5 200807 200809 aaaa bbbb

上記のようなデータがあり、年月1と年月2でグルーピングして、重複しているデータを抽出する場合は、以下のSQLでデータを取得できます。
SELECT MIN(ID),年月1,年月2
FROM TBL_TEMP
GROUP BY 年月1,年月2
HAVING COUNT(1) >= 2

上記のSQLの場合、重複データの中でIDが一番小さいもののみが取得されるため、ID=1、2の2データが取得できます。

これを重複データ全件、つまり、ID=1,2,3,5のデータを取得するには、SQLをどのように書けばよいのかがわかりません。

どなたかアドバイスを頂けないでしょうか?
よろしくお願いいたします。

[TBL_TEMP]
ID 年月1  年月2 項目A  項目B
--------------------------------------------
1 200909 200910 aaaa bbbb
2 200807 200809 aaaa bbbb
3 200909 200910 aaaa bbbb
4 200909 200909 aaaa bbbb
5 200807 200809 aaaa bbbb

上記のようなデータがあり、年月1と年月2でグルーピングして、重複しているデータを抽出する場合は、以下のSQLでデータを取得できます。
SELECT MIN(ID),年月1,年月2
FROM TBL_TEMP
GROUP BY 年月1,...続きを読む

Aベストアンサー

テーブルアクセス1回で済みます

with a as(
select id,年月1,年月2,count(*)over(partition by 年月1,年月2) co
from tbl_temp
)
select * from a where co >= 2

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  2   |  abc   |
  3   |  abc   |
  4   |  abc   |

上記結果でなくとも、


  ID  |  TAG  |
―――――+―――――|
  1   |  def   |
  2   |  ghi   |
  3   |  def   |
  4   |  abc   |

であっても構いません。(TAG列のデータはどんな内容でもよいです。)

実現させたいのは、
(1)ID列が重複しない結果を表示させたい、
かつ
(2)TAG列も表示させたい
ということです。

これでイケるだろ!と思ってあえなく失敗したSQLは下記です;
select distinct(ID), TAG from A


宜しくお願い致します。

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAか...続きを読む

Aベストアンサー

H2を知らないケド。Oracleだったら。

select ID, MIN(TAG) from A
GROUP BY ID
ORDER BY ID

ではどうでしょう?


select ID, MAX(TAG) from A
GROUP BY ID
ORDER BY ID
もお試しください。

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q複数のテーブルの重複データを抽出するには

現在
テーブル T_2011,T_2010,T_2009
の3つのテーブルがあり、それぞれには同じ形式の顧客情報が入っています。

例えば
顧客id,氏名,住所

この時、
T_2011には2011年に購入履歴のある方
T_2010には2010年に購入履歴のある方
T_2009には2009年に購入履歴のある方

のデータが入っております。

そこで、毎年購入がある方を抽出したいのですが
どうすれば可能でしょうか?

もちろん1つのテーブルに集めて、重複チェックをすれば
出るのですが、今後テーブル数が増えたり、2011年と2090年に
購入のある方など様々な形での抽出をする可能性があるため
クエリなどを利用し一発で抽出する方法があればと考えて
おります。

もちろん検索等を行い似たような例はあったのですが
ちょっと理解ができなかったためご質問させて頂きました。

宜しくお願いいたします。

重複チェックのキーは、顧客IDとなります。

環境は、windowsXP、access2000となっております。

Aベストアンサー

単に、
select a.顧客id,a.氏名,a.住所 from T_2011 a,T_2010 b,T_2009 c
where a.顧客id = b.顧客id and a.顧客id = c.顧客id
で出てくると思いますが。

年によって、氏名(結婚・離婚による)や住所(転居・行政の地番変更による)が変わることがあるので
最新のテーブルのデータを参照しましょう。

2010年、2009年に購入していて20011年に購入していない顧客は?
など購入していないという条件をつけるのは少し難しいと思われるかもしれませんが、
以下のようなSQLです。
select b.顧客id,b.氏名,b.住所 from T_2010 b,T_2009 c
where b.顧客id = c.顧客id and b.顧客id not in (select a.顧客id from T_2011 a)

※本当は、年毎にばらばらに持つのはのぞましくないんですが。
・・・例えば、2009~2011のいづれかの年に購入した客で大阪府に住んでいる人を出したいときとかに
急に手間が増えます。

単に、
select a.顧客id,a.氏名,a.住所 from T_2011 a,T_2010 b,T_2009 c
where a.顧客id = b.顧客id and a.顧客id = c.顧客id
で出てくると思いますが。

年によって、氏名(結婚・離婚による)や住所(転居・行政の地番変更による)が変わることがあるので
最新のテーブルのデータを参照しましょう。

2010年、2009年に購入していて20011年に購入していない顧客は?
など購入していないという条件をつけるのは少し難しいと思われるかもしれませんが、
以下のようなSQLです。
select b.顧客id,b.氏名,b.住所 from...続きを読む

QSQLでの複数列が重複してる行の削除(SQLite)

こんにちは。
複数の列で重複した列がある場合の行削除のクエリが思い付きません。

A表 A    B   C   D
  ==== === === ====
1 ああああ 100 200 ABCD
2 いいいい 200  90 ASKB
3 うううう 300 800 ALTE
4 ええええ 400 200 ABCD

B表
  ==== === === ====
1 ああああ 100 200 ABCD
2 ああああ 400 100 ABCD

このとき、A表とB表を比較し、B,C,D列で重複したデータをB表から削除した行を表示したいのです。

ほしいデータは

B表
  ==== === === ====
2 ああああ 400 100 ABCD

です。よろしくお願いします。

Aベストアンサー

別解をひとつ提示。(ANo.1でもいけると思います)

select B表.*
from B表
where not exists (
select A表.*
from A表
where A表.B = B表.B and A表.C = B表.C and A表.D = B表.D
);

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング