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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

Q&A

解決済

1回答

3977閲覧

ORACLE 重複データを一件に絞り取得

cuku

総合スコア108

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

0グッド

0クリップ

投稿2018/10/30 03:10

編集2018/10/30 03:15

oracleで selectを使ってデータを取得したら重複データがたくさん出てきたため、重複データは一件だけに絞って取得するように
SELECT のあとに DISTINCTを付けたのですがエラーになってしまします。
DISTINCTを付ける前はデータ取得できました
エラーメッセージは「SELECT式が無効です」というメッセージです。
調べながら書いたsql文なので構文的に違うんだと思うのですがどこがダメなのかわかりません。
わかるかたがいたら教えていただきたいです。
よろしくお願いします。

*まず selectで 取得したいカラムを書きました。
取得した後にvalue(キー),DISP(値)としてセットしたいため

oracle

1SELECT DISTINCT 2 MU.CORP_CD AS VALUE 3 , MC.CORP_NAME AS DISP

*fromでテーブルを選択して
INNER JOINで MUとMCのコードが同じカラム
を取得できるように絞りました。

oraccle

1 FROM 2 M_USER MU 3 INNER JOIN M_CORPORATION MC 4 ON MU.CORP_CD = MC.CORP_CD

EXSISTSを使いMUテーブルのUSER_CDとTRテーブルのUSER_CDが同じなら
trueを返す。
order by で並び替える。

oracle

1WHERE 2 EXISTS ( 3 SELECT 4 1 5 FROM 6 T_REQUEST TR 7 WHERE 8 MU.USER_CD = TR.USER_CD 9 ) 10 AND MU.DELETE_FLG = '0' 11 ORDER BY 12 MU.USER_CD ASC

oracle

1SELECT DISTINCT 2 MU.CORP_CD AS VALUE 3 , MC.CORP_NAME AS DISP 4 FROM 5 M_USER MU 6 INNER JOIN M_CORPORATION MC 7 ON MU.CORP_CD = MC.CORP_CD 8WHERE 9 EXISTS ( 10 SELECT 11 1 12 FROM 13 T_REQUEST TR 14 WHERE 15 MU.USER_CD = TR.USER_CD 16 ) 17 AND MU.DELETE_FLG = '0' 18ORDER BY 19 MU.USER_CD ASC

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

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

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

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

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

Orlofsky

2018/10/30 03:46

質問に使っているテーブルのCREATE TABLE文と今のデータがどうなっているかを示すINSERT文を何件か提示してください。
cuku

2018/10/30 04:06

今のデータを表すINSERT文とはどうゆうことなんでしょうか?
Orlofsky

2018/10/30 04:21

質問にCREATE TABLE, INSERTを追加してください。INSERTは今テーブルに存在するデータ。
guest

回答1

0

ベストアンサー

order by とdistinctの併用はできません。
なぜならdistinctで重複を除外する際にselect で列挙された順にソートを行うからです。

今の内容を生かして行うなら、order by は削除してselect を変更する。
項目数を合わせたいなら、もう一つ階層を深くしてその外側で、order byする。

よく見ると出力しているのは企業の情報なので、USER_CDによるソートは不要ですね。
order by を削除して下さい。
追記

並びを意識するならDISTINCTではなく、group by で明示した方が良いですね。

SQL

1SELECT 2 MU.CORP_CD AS VALUE 3 , MC.CORP_NAME AS DISP 4 FROM 5 M_USER MU 6 INNER JOIN M_CORPORATION MC 7 ON MU.CORP_CD = MC.CORP_CD 8WHERE 9 EXISTS ( 10 SELECT 11 1 12 FROM 13 T_REQUEST TR 14 WHERE 15 MU.USER_CD = TR.USER_CD 16 ) 17 AND MU.DELETE_FLG = '0' 18group by 19 MU.CORP_CD 20 , MC.CORP_NAME 21ORDER BY 22 MU.CORP_CD

追記

出力したいのはM_CORPORATIONの情報で、M_USERT_REQUESTは条件なので、
M_CORPORATIONに結合せず条件とすれば、重複は考慮する必要がありません。
また、処理時間も短縮されると思います。

SQL

1SELECT 2 CORP_CD AS VALUE 3 , CORP_NAME AS DISP 4FROM M_CORPORATION 5WHERE CORP_CD in ( 6 SELECT MU.CORP_CD 7 FROM M_USER MU inner join T_REQUEST TR 8 ON MU.USER_CD=TR.USER_CD 9 where MU.DELETE_FLG = '0' 10 ) 11ORDER BY 12 CORP_CD

投稿2018/10/30 03:59

編集2018/10/30 05:17
sazi

総合スコア25138

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

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

cuku

2018/10/30 04:09

ありがとうございます order by を消したら取得できました。 もう一つ階層を深くするとはどういうことなんでしょうか? 良ければ教えてほしいですです
sazi

2018/10/30 04:18

変更しました。忘れてください。m(__)m
cuku

2018/10/30 04:19

すいません USER_CDではなくCORP_CDでした。 まちがえていました
cuku

2018/10/30 04:29

ソートはどうしたらできるのでしょうか?
sazi

2018/10/30 04:32

distinct を付けるとselectしている項目の並びでソートされると思うのですが、そうなっていないですか?
cuku

2018/10/30 04:44

CORP_CDの値は001,002,003なのですが並び方が002,001,003となっています。 001,002,003の順番に表示したいです
sazi

2018/10/30 04:52

追記しました
cuku

2018/10/30 04:57

ありがとうございます sql流してみたのですが「group by形式ではありません」とエラーが出てしまいました
sazi

2018/10/30 05:19

「ORA-00979: GROUP BYの式ではありません。」というエラーなら、 「GROUP BY句があるSQLで、GROUP BYに指定していない列をSELECTに指定した。」場合に発生します。 実際に流しているSQLが質問内容とは違うのじゃないですか?
sazi

2018/10/30 05:20

select項目が質問の内容と違うなら追記したものも無駄かもしれませんが・・・
cuku

2018/10/30 05:23

CORP_NAMEはM_USERのテーブルです
sazi

2018/10/30 05:26

ん?質問の内容ではMC.CORP_NAMEとなっていますが?
cuku

2018/10/30 05:28

すいません。group byの形式でできました。
cuku

2018/10/30 05:29

そうです。間違えていました。 すいません。
cuku

2018/10/30 05:31

group by をしてカラムを選択すると重複したレコードが一つになる考え方であっているでしょうか?
sazi

2018/10/30 05:36

合っていますよ。 distinctの方がお手軽ですけど、これを機にマニュアルなどで確認されると良いと思います。
cuku

2018/10/30 05:38

はい。確認してみます。 丁寧に答えてくださりありがとうございました
sazi

2018/10/30 05:40

group byを使用するのでしたら、一度確認された方が良いと思うのは、CORP_NAMEはCORP_CODEと対になるものでしょうし、結局CORP_CODEをM_CORPORATIONと結合しているので同じ値だし、M_USERから取得するのは効率がよくない点です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問