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

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

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

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

Q&A

解決済

1回答

34221閲覧

Access SQLで"JOIN 式はサポートされていません"というメッセージが表示されます

退会済みユーザー

退会済みユーザー

総合スコア0

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

0グッド

1クリップ

投稿2017/06/29 08:24

編集2017/06/29 09:03

グループ階層の情報を持つテーブルとグループ名などの情報を持つテーブルがあります。
やりたい事としては以下の通りです。
1)上記2テーブルを結合させ、親グループID、グループ名を取得
2)1)で取得したグループが持つ子グループID,グループ名を取得

以下のSQLで実行しようとすると、タイトルに記載してある"JOIN 式はサポートされていません"というメッセージが
表示され、実行出来ない状態です。

SQL

1SELECT N1.parentid AS GroupID,G1.group_name AS GroupName 2FROM public_groupandpeople AS N1 INNER JOIN public_groups AS G1 ON N1.parentid = G1.group_id 3WHERE (N1.parentid='XXXXX') and Not (N1.parentid)='' 4GROUP BY N1.parentid,G1.group_name 5UNION 6SELECT N2.parentid AS GroupID,G2.group_name AS GroupName 7FROM ((public_groupandpeople AS N1 INNER JOIN public_groups AS G1 ON N1.parentid = G1.group_id) 8LEFT JOIN ((public_groupandpeople AS N2 INNER JOIN public_groups AS G2 ON N2.parentid = G2.group_id)) ON N1.childid = N2.parentid) 9WHERE (N1.parentid='GR00002Y') and Not (N2.parentid)='' 10GROUP BY N2.parentid,G2.group_name;

どこを直せばいいのか、まったく見当もつかない状態です・・・。
正しいSQLについて教えて頂けますと幸いです。

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

上記SQLはユニオンクエリになっていましたので、エラーが発生している方のクエリのみ切り離しました

SQL

1SELECT N2.parentid AS GroupID,G2.group_name AS GroupName 2FROM ((public_groupandpeople AS N1 INNER JOIN public_groups AS G1 ON N1.parentid = G1.group_id) 3LEFT JOIN ((public_groupandpeople AS N2 INNER JOIN public_groups AS G2 ON N2.parentid = G2.group_id)) ON N1.childid = N2.parentid) 4WHERE (N1.parentid='GR00002Y') and Not (N2.parentid)='' 5GROUP BY N2.parentid,G2.group_name; 6

エラー画像

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

取りあえず原因の切り分けからしましょう。

2つのSQLを UNION してますが、それぞれのSQLを単独で実行した場合、どちらのSQLでエラーがでますか。

エラーが出たほうのSQLをデザインビューにして、その画像を添付してもらえますか。

コメントを受けて追記

質問者さんの 2017/07/03 15:53コメントから引用

public_groupandpeople *parentid *childid ---------------------------- GR0000 GR0001 GR0000 GR0002 GR0000 GR0003 GR0001 GR0001X GR0001 GR0001Y GR0002 GR0002X GR1000 GR1001 GR1001 GR1001X GR1001 GR1001Y

このテーブルは下記のような階層モデルを表していると思います。

GR0000┬GR0001┬GR0001X    │   └GR0001Y    ├GR0002─GR0002X    └GR0003 GR1000─GR1001┬GR1001X        └GR1001Y

これから、GR0000配下にあるグループID を取得するには、下記のSQLになります。

SQL

1SELECT DISTINCT parentid 2FROM public_groupandpeople 3WHERE parentid='GR0000' 4UNUON ALL 5SELECT childid 6FROM public_groupandpeople 7WHERE parentid="GR0000" 8UNUON ALL 9SELECT T1.childid 10FROM public_groupandpeople T1 INNER JOIN public_groupandpeople T2 11 ON T1.parentid = T2.childid 12WHERE T2.parentid="GR0000";

ルート階層のデータ
UNION ALL
1階層下のデータ
UNION ALL
2階層下のデータ;

という構成になっています。

このSQLをクエリとして保存します。名前はQ1とします。

SQL

1SELECT Q1.parentid, T1.group_name 2FROM Q1 INNER JOIN public_groups T1 ON Q1.parentid = T1.group_id;

出力結果

parentid group_name --------------------- GR0000 グループA GR0001 グループB GR0002 グループC GR0003 グループD GR0001X グループE GR0001Y グループF GR0002X グループG

GR0000配下のグループデータが出力されます。

Q1をサブクエリにすれば一つのクエリに纏められます。

SQLで階層モデルを表現するのは難しいです。現状のテーブル設計が最適とはいえないかもしれません。下記辺りを参考にして設計を再考するのもいいかもしれません。

階層構造データへの挑戦 - Qiita
Fertile Forest Model (ツリー構造データをRDBで扱うための第五のモデル) - Qiita

投稿2017/06/29 08:57

編集2017/07/04 21:12
hatena19

総合スコア33715

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

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

退会済みユーザー

退会済みユーザー

2017/06/29 09:05

失礼いたしました。 後者のSQLの方にエラーが発生しています。前者については問題なく動作しております。 デザインビューのキャプチャを取ろうと思いましたが、エラーメッセージが表示され デザインビューが開けない状態です。 他に何か必要情報などありましたら教えてください。 よろしくお願いいたします。
hatena19

2017/06/29 09:18

結合の仕方かおかしいように思います。 どのような結果を想定しているのか不明なので、現状の各テーブルの主なフィールド名と主キー設定、 データ例とそのデータから欲しい結果の出力例を提示してもらえますか。
退会済みユーザー

退会済みユーザー

2017/07/03 01:19 編集

ご返事が遅くなりまして、大変申し訳ございません・・・・。 簡易ですが、以下、二つのテーブルがあります。 左側のテーブルは親グループID、子グループIDの情報を階層的に持っているテーブルで 主キーはparentid,childidです 右側のテーブルは各グループIDのグループ名情報を持っているテーブルで 主キーはgroup_idです |parentid|childid | |group_id |group_name| ------------------- --------------------------- |GR0000|GR0001| |GR0000 |グループA| |GR0000|GR0002| |GR0001 |グループB| |GR0000|GR0003| |GR0002 |グループC| |GR0001|GR0001X| |GR0003 |グループD| |GR0001|GR0001Y| |GR0001X |グループE| |GR0002|GR0002X| |GR0001Y |グループF| |GR0002|GR0002Y| |GR0002X |グループG| |GR0002|GR0002Z| |GR0002Y |グループH|    |GR0002Z |グループI | ます、parentidとgroup_idで結合させますが、以下のような事を実現したいと思っています。 1)GR0000というグループIDとグループ名を取得 2)GR0000が持つ子グループIDとそのグループ名を取得 3)2)で取得した子グループが持つ子グループIDとそのグループ名を取得 で、GR0000と同レイヤーのグループもあって、それらのグループは除外したいので 上記SQL文では以下のように指定しています。 WHERE (N1.parentid='GR0000') and Not (N1.parentid)='' で、UNIONしている後者のSQLについても以下で記載しています。 WHERE (N1.parentid='GR0000') and Not (N2.parentid)='' ※質問の方は"GR00002Y"と記載されていますが、スルーしてください。常に同じ親グループIDを指定しています。 以上、上手く説明が出来ず、大変恐縮ですがご教示頂けますと幸いです。 よろしくお願いいたします。
hatena19

2017/07/03 02:55

ごめんなさい。せっかく細かく書いていただいのですが、肝心なところが抜けているので、把握できません。 まず、「左側のテーブル」「右側のテーブル」というのは、それぞれ public_groupandpeople と public_groups のどちらを指すのですか。 データ例は、public_groupandpeople と public_groups のどちらのテーブルのものですか。 あるいは、2つのテーブルを結合した結果ですか。 下記のような感じで書いてもらうと分かりやすいです。 *が付いたフィールドが主キー public_groupandpeople *parentid *childid group_id ---------------------------- GR0000 GR0001 GR0000 GR0000 GR0002 GR0001 GR0000 GR0003 GR0002 GR0001 GR0001X GR0003 GR0001 GR0001Y GR0001X GR0002 GR0002X GR0001Y GR0002 GR0002Y GR0002X GR0002 GR0002Z GR0002Y public_groups *group_id group_name ---------------------- GR0000 グループA GR0001 グループB GR0002 グループC GR0003 グループD GR0001X グループE GR0001Y グループF GR0002X グループG GR0002Y グループH 欲しい結果 GroupID group_name -------------------- ???? ????? このデータ例は、あくまで私の勝手な推測ですので、表記方法の参考にとしてください。 しかしながら、親子関係をもつ階層構造データをSQLで扱うのはなかなか難しいようです。 親子関係を表すので、parentid childid group_id と3つフィールドがあるというテーブル設計から おかしいように感じます。 階層構造データへの挑戦 - Qiita http://qiita.com/uchinami_shoichi/items/5fa52f340003107d46c1
退会済みユーザー

退会済みユーザー

2017/07/03 06:53

大変、失礼いたしました。 改めて以下、記載いたします。 分かりやすいよう、少々public_groupandpeopleテーブルについて 変えてみました。 public_groupandpeople *parentid *childid ---------------------------- GR0000 GR0001 GR0000 GR0002 GR0000 GR0003 GR0001 GR0001X GR0001 GR0001Y GR0002 GR0002X GR1000 GR1001 GR1001 GR1001X GR1001 GR1001Y public_groups *group_id group_name ---------------------- GR0000 グループA GR0001 グループB GR0002 グループC GR0003 グループD GR0001X グループE GR0001Y グループF GR0002X グループG GR1000 グループH GR1001 グループI GR1001X グループJ GR1001Y グループK 欲しい結果 *parentid *group_name ---------------------- GR0000 グループA GR0001 グループB GR0001X グループE GR0001Y グループF GR0002 グループC GR0002X グループG GR0002Y グループH という感じです。 ここでやりたい事としては、GR0000,G1001はトップレイヤーのグループですが、 GR0000配下にあるグループ情報のみ取得できるようにしたいのです。 イメージが伝わりましたでしょうか・・・・?
hatena19

2017/07/04 21:15

ようやく把握できました。(2つのテーブルを横に並べているとは思いもよらなかった) 回答に追記しましたので参照ください。
退会済みユーザー

退会済みユーザー

2017/07/07 02:42

ご回答ありがとうございます! 正直、まだSQLについて理解できていない部分もあるので少しずつかみ砕きながら 理解していきたいと思います。 こちらで解決できそうだと思います。本当にありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問