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

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

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

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

SQL

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

12696閲覧

SQL:検索対象とは別のテーブルを参照した値の取得、表示させる方法

syk00

総合スコア11

Oracle

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

SQL

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2019/07/10 02:50

編集2019/07/10 05:36

前提・実現したいこと

こんにちは。お世話になります。プログラミング初心者です。
現在私はOracleとJavaを使った検索画面の作成課題を行っています。
その検索(SELECT)を行うためのSQL文の作成に詰まってしまい、自分で調べてもいまいちわからなかったので質問させていただきます。

まずテーブルの構成ですが、検索対象となるメインのテーブルには名前と出身地や所属の番号の情報が、そして番号に紐づけする形で出身地や所属の名称情報が入ったサブテーブルが複数存在しています。
メインテーブルのカラム名に対応する別テーブルを参照することで名称がわかるイメージです。
例えば、メインテーブルの出身地カラムには1,2,3…とそれぞれ番号のみが入っていて、別テーブルに1は東京、2は千葉…といった番号と名称の情報が格納されています。

検索や表示結果には名称を使いたいと考えています。
名前、または所属や出身地名で検索をし、その結果を一覧で取得します。
そのための記述方法を教えていただきたいです。
(SELECT指定はサブテーブルのカラムですが、FROM指定はメインテーブルを、そして検索条件でメインとサブを紐付けて参照するイメージでいます…)

取得イメージは下記のような感じです。(例……出身地:東京で検索をした場合)

名前      所属     出身地


田中太郎 営業部 東京
佐藤一郎 人事部 東京 etc...

:
:

また可能であれば、メインテーブルのカラム順に検索結果を一度に取得できたらと思っていますが、まとめて抽出できるsqlの記述方法などはありますでしょうか?(欲張りですみません)
知恵を貸していただけたらと思います、よろしくお願いします。

テーブル構成

テーブル名
MainData
カラム名   データタイプ    他
1 ID int 主キー
2 FulName varchar
3 DepartmentID int 外部キー
4 StateID int 外部キー

テーブル名
DepartmentData
カラム名   データタイプ   他
1 DepartmentID int 主キー
2 DepartmentName varchar

テーブル名
StateData
カラム名   データタイプ   他
1 StateID int 主キー
2 StateName varchar

### テーブル作成とデータ挿入のSQL文

SQL

1--テーブルの作成 2CREATE TABLE MainData ( 3ID int, 4FullName varchar(30), 5DepartmentID int, 6StateID int); 7 8CREATE TABLE DepartmentData ( 9DepartmentID int, 10DepartmentName varchar(30)); 11 12CREATE TABLE StateData ( 13StateID int, 14StateName varchar(30)); 15 16--主キーの設定 17ALTER TABLE MainData 18ADD CONSTRAINT PK_ID PRIMARY KEY (ID); 19 20ALTER TABLE DepartmentData 21ADD CONSTRAINT PK_DID PRIMARY KEY (DepartmentID); 22 23ALTER TABLE StateData 24ADD CONSTRAINT PK_SID PRIMARY KEY (StateID); 25 26--外部キーの設定 27ALTER TABLE MainData 28ADD FOREIGN KEY(DepartmentID) 29REFERENCES DepartmentData(DepartmentID); 30 31ALTER TABLE MainData 32ADD FOREIGN KEY(StateID) 33REFERENCES StateData(StateID); 34 35 36--データの挿入(仮データです) 37INSERT INTO DepartmentData VALUES (1,'営業部'); 38INSERT INTO DepartmentData VALUES (2,'人事部'); 39INSERT INTO DepartmentData VALUES (3,'広告部'); 40 41INSERT INTO StateData VALUES (1,'東京'); 42INSERT INTO StateData VALUES (2,'神奈川'); 43INSERT INTO StateData VALUES (3,'千葉'); 44 45 46INSERT INTO MainData VALUES (1,'田中太郎',1,1); 47INSERT INTO MainData VALUES (2,'佐藤一郎',2,1); 48INSERT INTO MainData VALUES (3,'鈴木花子',3,3); 49 50INSERT INTO DepartmentData VALUES (1,'営業部'); 51INSERT INTO DepartmentData VALUES (2,'人事部'); 52INSERT INTO DepartmentData VALUES (3,'広告部'); 53 54INSERT INTO StateData VALUES (1,'東京'); 55INSERT INTO StateData VALUES (2,'神奈川'); 56INSERT INTO StateData VALUES (3,'千葉'); 57

試したこと

まずはSELECT結果が数字ではなく文字で表示できるようにしたいと考えて調べた結果、結合を使って表示できるということは分かったのですが(下記参照)、これだと格納されたデータの一覧表示となってしまい検索ができず、行いたいこととは見当違いなことをしている気がして、混乱してしまっています。

SQL文

SQL

1SELECT 2a.FullName, b.DepartmentName, c.StateName 3from MainData a 4left outer join DepartmentData b on a.DepartmentID = b.DepartmentID 5left outer join StateData c on a.StateID = c.StateID ; 6
*備忘録用追記

検索条件を付ける際、
自分ではこのように記述をしてエラーを返されていました。
今見ると自分でも不思議ですし、先輩方にも笑われてしまいそうですね。

問題の記述

SQL

1 2--その1 3SELECT a.FullName, b.DepartmentName, c.StateName 4from MainData a 5where a.FullName ='佐藤一郎' 6 left outer join DepartmentData b on a.DepartmentID = b.DepartmentID 7 left outer join StateData c on a.StateID = c.StateID ; 8 9--その2 10SELECT a.FullName, b.DepartmentName, c.StateName 11from MainData a 12where c.StateName IN (select c.StateName from MainData a 13 left outer join StateData c on a.StateID = c.StateID ); 14 15

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

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

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

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

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

Orlofsky

2019/07/10 02:57 編集

SQLで使われるテーブルはCREATE TABLEされている必要があります。質問にテーブル定義の説明もCREATE TABLEで、同じようにSELECTされるデータもINSERTされている必要がありますから、INSERT文でhttps://teratail.com/help#about-markdown の [コードを入力] で載せておくとコメントが付き易いです。
syk00

2019/07/10 03:08

コメントありがとうございます。 すでにテーブル作成とデータ挿入を終えているのを前提で話をしていたので、そちらも追って記します。 データ型については、今回のものは課題で実用的なものではないため、このままvarcharとさせてください。 また別のものを作成することになった際には気に留めておこうと思います。
Orlofsky

2019/07/10 03:13

信用を無くすだけかと。
syk00

2019/07/10 03:44

何に対して信用を無くすと仰られているのでしょうか? コードの追記に関してはコメントをいただいたので改めて記述するために打ち込んでいたところですし(自身の練度では素早く打ち込めないため追記しますと返しました)、 データ型にしても、現在作成しているものに関しては実用のものではないため、実用を想定するにしても次回のデータ作成時から気を付ければいいものと判断いたしました。
guest

回答1

0

ベストアンサー

検索や表示結果には名称を使いたいと考えています

WHERE 条件で名称を指定して下さい。
例えば、出身地を条件にする場合は以下になります。

SQL

1SELECT a.FullName, b.DepartmentName, c.StateName 2from MainData a 3 left outer join DepartmentData b on a.DepartmentID = b.DepartmentID 4 left outer join StateData c on a.StateID = c.StateID 5where c.StateName = '東京'

※複数の条件の場合にANDやORで条件を増やしたり、likeによるあいまい検索などは仕様に合わせて下さい。

投稿2019/07/10 03:02

sazi

総合スコア25173

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

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

syk00

2019/07/10 03:21

回答でいただいた通りに記述して試してみたらうまくできました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問