質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

7回答

1374閲覧

SQLの重複について

tuntun

総合スコア35

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/05/26 08:36

編集2015/05/27 01:23

SQLの重複について質問ですが、

例えば
ID A B

1 あ a 1 あ a 1 い b 2 い b 2 い b 2 う c 2 う c

という表があった際にIDの中の項目Aと項目Bが重複した時のみ
重複処理を行って、

ID A B

1 あ a 1 い b 2 い b 2 う c

ということをSQL文で実行したいのですがDISTINCTでは条件を付けることができないみたいなのでどうしたらよいでしょうか。

追記)同じID内で項目Aと項目Bが同じものがあった時1件として出力したいということです。

追記2)この表だったらIDが1の場合に2行ありますが、この2行をまとめて1行で表したいです。

追記3)
(更新前)
ID A B C

1 あ a 1 1 あ a 2 1 い b 3 2 い b 4 2 い b 5 2 う c 6 2 う c 7

というテーブルがあり、
このテーブルを

(更新後)
ID A B C

1 あ a 1 1 い b 3 2 い b 4 2 う c 6

という様に
更新前の表のIDが1の時に1行目と2行目が同じ場合、Cの数字が若いものを
更新後テーブルに出力したいということです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

ID A B C

1 あ a 1 1 い b 3 2 い b 4 2 う c 6

であれば、

lang

1 2SELECT ID, A, B, MIN(C) AS C 3FROM TABLE_1 4GROUP BY ID, A, B
ID A B C

1 あ a 1 **2** い b **3 ** 2 う c 6

※ Cの最小値のIDは、最小のIDとは限らない。

という条件であるなら、書きやすさ、どこにインデックスがあるかなどで答えが違いますが、
一番簡単な書き方(と思うもの)

lang

1SELECT ID, A, B, C 2FROM TABLE_1 3WHERE 4 (A, B, C) IN 5 (SELECT A, B, MIN(C) AS C 6 FROM TABLE_1 7 GROUP BY A, B)

ただし、C が、IDのグループの中で一意でないなら、複数出力されます。
そのときは、IDが複数のときは、どういう条件でIDを出力したいか?
というのが分からないと処理できません。

投稿2015/05/27 01:49

kantomi

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuntun

2015/05/27 02:19

言葉足らずの質問ですいませんでした。 とりあえずこれだけの情報でSQLを作ってみたいと思います。
guest

0

結果の2行目と3行目の項目Aと項目Bが重複していますね。
DISTINCTならそうなるはずです。

質問と結果が矛盾しているので、意味がいまいち分かりません。

2行目と3行目も集約したいのであれば、集約した結果、IDには何を出力したいでしょう?
それによって、答えは違ってきます。

lang

1SELECT 2 MIN(ID) AS ID -- 一番若いID (条件が複雑なときには、サブクエリが必要になる) 3 , A, B 4FROM Table1 5GROUP BY A,B 6

投稿2015/05/26 08:54

kantomi

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kantomi

2015/05/26 08:56

SELECT A, B FROM table GROUP BY A, B; なら、 SELECT DISTINCT A, B FROM table の方が高速です。
tuntun

2015/05/26 09:04

矛盾した質問すいませんでした。 追記にも書きましたが、同じID内でA,Bの両方が同じものであれば1件で表現したいということです。
kantomi

2015/05/26 09:16

回答にも書きましたが、重複しているIDが(5, 100, 786)だったとき、何を出力したいか。それが分からないとどうにも答えようがないのです。
tuntun

2015/05/27 00:14

重複しているIDが(5, 100, 786)というのがどこで出てきているのか、例で言われているのでしょうか? AとBが全く同じID=5のものがあったらそれを一つにまとめて表示したいということです。
guest

0

lang

1SELECT A, B FROM table GROUP BY A, B;

これでA,Bで重複している項目がひとつに纏められます。
状況に応じてDESCをつけてください。

投稿2015/05/26 08:51

Yasha_Wedyue

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

先に解答されている方がいらっしゃいましたので、削除しました。

投稿2015/05/27 01:37

編集2015/05/27 01:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuntun

2015/05/27 02:21

何回も回答ありがとうございました。
guest

0

1行目と2行目が同じ場合

3行目のID、A、Bが同じ場合も集約しますよね?
であれば、ID,A,Bでグループ化しCの最少値を返せば良いと思います。

lang

1Select ID, A, B, Min(C) From Hoge Group By ID, A, B

投稿2015/05/27 01:35

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuntun

2015/05/27 02:20

回答ありがとうございます。 Minを使って作ってみたいと思います。
guest

0

こんにちは。

追記2)この表だったらIDが1の場合に2行ありますが、この2行をまとめて1行で表したいです。

この表だったらIDが1の場合に2行と書かれているこの表というのは、

ID A B ------------------------ 1 あ a 1 い b 2 い b 2 う c

これのことでしょうか?
となると、最終的には1行目のA、Bはどのような表示のされかたがよいのでしょうか?

ID A B ------------------------ 1 ? ?

最終的にどのような取り方をしたいかイメージを提示して頂いた方が、アドバイスがつきやすいかと思います。
わたしもそうでしたが、2個目の表のイメージで取得したいのだと思っていました。

投稿2015/05/27 00:56

編集2015/05/27 00:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuntun

2015/05/27 01:25

問題提起の時点で私の考えが間違っていました。本当にやりたいことを追記に書き込みましたのでご確認下さい。
guest

0

こんにちは。

条件というのが何を指しているのかわからないですが…

単純にGroupByかDistinctで良さそうな。

select * from hoge group by id, A, B order by id, A, B
select distinct id, A, B from hoge order by id, A, B

投稿2015/05/26 09:04

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問