🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

2回答

2846閲覧

pgadmin 内部結合したテーブルから必要なカラムのデータを抽出したい

ryuya1204

総合スコア12

pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/01/13 13:28

内部結合したテーブルから必要なカラムのデータを抽出したい

現在、テーブルAとテーブルB、テーブルCがある状態です。
テーブル3つを内部結合させた状態までは行えているのですが、そこから必要な情報を抽出したいのですが、うまくいかない状態となっております。

実行文としては、

SELECT * FROM テーブルA INNER JOIN テーブルB ON テーブルA.カラム名 = テーブルB.カラム名 INNER JOIN テーブルC ON テーブルA.カラム名 = テーブルC.カラム名

として実行して、3つのテーブルのカラムは内部結合している状態にはなっています。

ここから、それらのテーブルのカラムを抽出する方法はどのように行うのでしょうか?

SELECT カラム名 だとsyntax errorになってしまいます。
副問合せを行うのかと思うのですが、どのように情報を取得すれば良いのでしょうか?

初歩的な質問で大変申し訳ございません。

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

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

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

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

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

m.ts10806

2021/01/13 20:18 編集

「Java」はどう関係するのでしょうか。 SQL単体で完結させられる内容では? ただひとえに「SQL」といっても方言があります。 どのDBか、バージョン、 あとテーブル定義も提示されたほうが的確な回答得られると思います。
m.ts10806

2021/01/13 20:19

>SELECT カラム名 だとsyntax errorになってしまいます。 エラーも提示されたほうが良いです。
退会済みユーザー

退会済みユーザー

2021/01/14 18:49

解決したならクローズお願いします。 放置はテンション落ちるので…。
ryuya1204

2021/01/15 05:05

せっかくご回答いただいていたのに、返信できておらず大変申し訳ございません。 無事解決いたしました! ご丁寧にありがとうございます!
guest

回答2

0

※mahnyさんの回答をより具体的にした補足的内容となっています。

具体的な値でイメージを作ったほうが良いです。
Excelとかでも手書きでも良い。

テーブルA

idnameB_categoryC_category

テーブルB

idname

テーブルC

idname

「テーブルAのB_categoryにはテーブルBのIDが入りC_categoryにはテーブルCのIDが入る」

としましょう。

で、「テーブルAにテーブルBとテーブルCを結合してそれぞれのnameを取る」
というSQLを書こうとしているのが、現在質問されようとしていることになると推測します。

最終形は以下を目指します。

結合結果イメージ

idnameB_categoryB_category_nameC_categoryC_category_name

それぞれのIDは既にテーブルAが持っているので、nameだけを持ってくる。
nameは別の名前にする。

※手元の環境PostgreSQL13で確認

CREATE TABLE (pgAdmin4で自動生成されたものに少し手を加えたもの)

sql

1CREATE TABLE b 2( 3 id integer NOT NULL, 4 name character varying(20) NOT NULL, 5 CONSTRAINT b_pkey PRIMARY KEY (id) 6); 7CREATE TABLE c 8( 9 id integer NOT NULL, 10 name character varying(20)NOT NULL, 11 CONSTRAINT c_pkey PRIMARY KEY (id) 12); 13 14CREATE TABLE a 15( 16 id integer NOT NULL, 17 name character varying(30) NOT NULL, 18 b_category integer NOT NULL, 19 c_category integer NOT NULL, 20 CONSTRAINT a_pkey PRIMARY KEY (id), 21 CONSTRAINT fk_b_category FOREIGN KEY (b_category) 22 REFERENCES b (id) MATCH SIMPLE 23 ON UPDATE NO ACTION 24 ON DELETE NO ACTION, 25 CONSTRAINT fk_c_category FOREIGN KEY (c_category) 26 REFERENCES c (id) MATCH SIMPLE 27 ON UPDATE NO ACTION 28 ON DELETE NO ACTION 29); 30


外部キー制約
を入れている関係でデータはb,cから入れてください。

SQL

1insert into b values (1,'B1'); 2insert into b values (2,'B2'); 3insert into b values (3,'B3'); 4insert into b values (4,'B4'); 5insert into b values (5,'B5'); 6 7insert into c values (1,'C1'); 8insert into c values (2,'C2'); 9insert into c values (3,'C3'); 10insert into c values (4,'C4'); 11insert into c values (5,'C5'); 12 13insert into A values (1,'hoge1',1,1); 14insert into A values (2,'hoge2',3,4); 15insert into A values (3,'hoge3',5,2); 16

質問に提示されているSQL

sql

1select 2 * 3from a 4 join b on b.id = a.b_category 5 join c on c.id = a.c_category

※joinはinner joinと同義

イメージ説明

※A5:SQL Mk-2 2.15.3による結果

DBによってはここでエラーが出ます。
なぜならa,b,cにid,nameという同名のカラムがあるからです。
*は対象のテーブル全てを取得してくるのでそのようになります。

DBやツールによっては、提示のようにjoinされたカラムに連番つけてくれて回避してくれます。

pgAdmin4ではこう。
イメージ説明

同名で出ていますが、内部的には重複しないように変換がかかっている可能性があります。

「それぞれのテーブルの」を取得したい場合は
テーブル名.カラム名
です。

sql

1select 2 a.* 3 ,b.* 4 ,c.* 5from a 6 join b on b.id = a.b_category 7 join c on c.id = a.c_category

これでも結果は変わりません。
id,nameをそのまま持ってきています。

「結合結果イメージ」ではbとcのidは不要ですね。
テーブル名.カラム名の法則にのっとり、「全て」を表す*ではなく、カラム名を明示します。

sql

1select 2 a.id 3 ,a.name 4 ,a.b_category 5 ,a.c_category 6 ,b.name 7 ,c.name 8from a 9 join b on b.id = a.b_category 10 join c on c.id = a.c_category

イメージ説明

また、「カラム名」「テーブル名」には「エイリアス」と言って、別名をつけることができます。
今回のようにnameという名称が重複していたり、テーブル名カラム名が長い時に短縮名称をつけて使いまわすようなときに使えます。

※詳しくは「使いたいDB エイリアス」で調べてください。

最終形

sql

1select 2 a.id 3 ,a.name 4 ,a.b_category 5 ,b.name b_category_name 6 ,a.c_category 7 ,c.name c_category_name 8from a 9 join b on b.id = a.b_category 10 join c on c.id = a.c_category

イメージ説明

ざっくり言ってしまうと「テーブル結合」は「大きい1つのテーブルを作る」ようなものです。

なので「inner join限定」であればこんな感じにも書けます。(出力結果は同じ)

sql

1select 2 a.id 3 ,a.name 4 ,a.b_category 5 ,b.name b_category_name 6 ,a.c_category 7 ,c.name c_category_name 8from a,b,c 9 where b.id = a.b_category 10 and c.id = a.c_category

投稿2021/01/13 21:19

m.ts10806

総合スコア80875

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

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

0

ベストアンサー

SELECT カラム名 だとsyntax errorになってしまいます。

SELECT文は基本的にこの形です。
SELECT テーブル名.カラム名 FROM テーブル名

JOIN区とかはとりあえずFROMで指定したテーブルに結合すると思えばいいです。

テーブル名やカラム名の後ろにAS句をつける事により別名をつける事が出来ますが
その場合はこうなります。
SELECT 別名.カラム名 FROM テーブル名 AS 別名

ということで、今回の場合ならこうでしょうか。

sql

1SELECT テーブル名.カラム名 FROM テーブルA 2INNER JOIN テーブルB ON テーブルA.カラム名 = テーブルB.カラム名 3INNER JOIN テーブルC ON テーブルA.カラム名 = テーブルC.カラム名

sql

1SELECT A.カラム名 FROM テーブルA AS A 2INNER JOIN テーブルB AS B ON A.カラム名 = B.カラム名 3INNER JOIN テーブルC AS C ON A.カラム名 = C.カラム名

投稿2021/01/13 13:34

編集2021/01/13 15:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ryuya1204

2021/01/13 14:29

ご回答いただきありがとうございます。 select テーブル名.カラム名で入力したのですが、 syntax error at or near "SELECT" と表示されてしまいました。 記述した内容としては、 SELECT * FROM テーブルA INNER JOIN テーブルB ON テーブルA.カラム名 = テーブルB.カラム名 INNER JOIN テーブルC ON テーブルA.カラム名 = テーブルC.カラム名 SELECT テーブル名.カラム名になります。 SELECTに()が必要かと思い、実行してみましたが同様にエラーとなってしまいます…
退会済みユーザー

退会済みユーザー

2021/01/13 15:05

すみません、さすがに端折り過ぎたので回答を修正しました。 FROMは一部のDBを除き省略できません。 JOINはFROMの拡張のイメージになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問