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

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

新規登録して質問してみよう
ただいま回答率
85.47%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

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

SQL

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

Q&A

解決済

4回答

18238閲覧

SQL left join の入れ子について

gr883e5b

総合スコア14

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

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

SQL

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

0グッド

1クリップ

投稿2016/08/20 03:08

社員名簿を考える。
マスターテーブル(ここでは便宜的に、ID と name だけを持つテーブル、
変更の少ないテーブルの意味で)が複数ある。

t_性別

+----+------+ | id | name | +-----------+ | 1 | 男性 | +-----------+ | 2 | 女性 | +----+------+

t_事業所

+----+--------+ | id | name | +----+--------+ | 1 | 東京 | +----+--------+ | 2 | 大阪 | +----+--------+ | 3 | 名古屋 | +----+--------+ ...

t_部署

+----+------+ | id | name | +----+------+ | 1 | 営業 | +----+------+ | 2 | 技術 | +----+------+ | 3 | 製造 | +----+------+ ...

社員名簿のテーブルには
性別, 事業所, 部署等はそれぞれマスターの id が入力されている。

t_社員名簿

+----+---------+-----------+------+--------+------+ | id | surname | givenname | 性別 | 事業所 | 部署 | +----+---------+-----------+------+--------+------+ | 1 | doe | john | 1 | 2 | 2 | +----+---------+-----------+------+--------+------+ | 1 | doe | jane | 2 | 1 | 1 | +----+---------+-----------+------+--------+------+ | 1 | foo | bar | 2 | 1 | 3 | +----+---------+-----------+------+--------+------+ ...

を以下のように出力させたい。

+----+---------+-----------+------+--------+------+ | id | surname | givenname | 性別 | 事業所 | 部署 | +----+---------+-----------+------+--------+------+ | 1 | doe | john | 男性 | 大阪 | 技術 | +----+---------+-----------+------+--------+------+ | 1 | doe | jane | 女性 | 東京 | 営業 | +----+---------+-----------+------+--------+------+ | 1 | foo | bar | 女性 | 東京 | 製造 | +----+---------+-----------+------+--------+------+ ...

この場合、以下の SQL で得られる。

SQL

1select 2 t_社員名簿.id 3 , t_社員名簿.surname 4 , t_社員名簿.givenname 5 , t_性別.name 6 , t_事業所.name 7 , t_部署.name 8from 9 ((t_社員名簿 left join t_性別 on t_社員名簿.性別 = t_性別.id) 10 left join t_事業所 on t_社員名簿.事業所 = t_事業所.id) 11 left join t_部署 on t_社員名簿.部署 = t_部署.id 12

わけですが、
t_社員名簿に(リレーションのある)フィールドが増えれば増えるほど、
left join の入れ子が増えて、とても可読性の悪いものに...

みなさんはどのように記述されているのでしょうか?
ご意見いただければと

[補足]
おおむね、access で使用しています(まれに、SQL Server)。

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

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

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

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

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

guest

回答4

0

Accessのコンセプト自体がGUI経由のクエリ作成が中心なので、
クエリを直接いじる場合の不便さは異常なんですよね・・・

Accessならクエリをメンテナンスする際は、
エディタに退避して整形した上で直しますが、
Accessに張り直した後に選択クエリを開き直したりすると速攻でAccess側でインデントが無効化されるので、
そこはもうそんなものとして諦めています^^;

話は変わりましてAccessには限ったことでないですが、
個人的にはクエリを見やすくしたり、修正しやすくする上で以下を意識しています(あまり質問とは関係ない)。

  • インデントを頑張る(といっても初期値を好みに設定してSQLエディタの自動整形一発がほとんどで頑張ってはない)
  • SQLの予約語は大文字で統一(好み)
  • カラム間の区切り方は前カンマ派(好み)

2つ目と3つ目は宗教戦争を引き起こしかねない部分なので、
あくまで参考程度に記載しています。

2つ目は大文字で統一と言ってはいますが、
テーブル名やカラム名も英大文字ベースだとメリハリがつかないので、
その場合は小文字のままとかもやったりします。
3つ目はカラム増減に関するSELECT句の修正は、
大体末尾側への追加・削除が多いので、前カンマの方が末尾消した場合にコンパイルエラーにならないよねとかいうそんなレベルです。

投稿2016/08/20 13:04

Panzer_vor

総合スコア1636

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

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

0

私はインデントを頑張っています。自分ルールなので読みやすいかは不明ですが。
なので開き直すとインデントがなくなる事があるAccessはあまり使わないようにしてます。

例えば、以下の様な感じです。
そのときそのときで多少は変わりますけど、joinとonの対応関係がわかるように気を付けています。

SQLのリフォーマットが優秀なエディタが利用できるならそれに従います。

sql

1select 2 t_社員名簿.id 3~省略~ 4 , t_部署.name 5from 6 ( ( t_社員名簿 7 left join t_性別 8 on t_社員名簿.性別 = t_性別.id 9 ) 10 left join t_事業所 11 on t_社員名簿.事業所 = t_事業所.id 12 ) 13 left join t_部署 14 on t_社員名簿.部署 = t_部署.id

プロポーショナルフォントだと崩れますけどね。

投稿2016/08/20 04:00

flied_onion

総合スコア2604

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

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

gr883e5b

2016/08/20 06:02

やはり、access の (left) join は入れ子が不可避なのですね。 "開き直すとインデントがなくなる" access のクソ仕様には辟易しております。 vim(+プラグイン)で編集、貼り付けとめんどくさいことをしております。
guest

0

ベストアンサー

社員(社員_ID,事業所_ID,部署_ID,社員名)
事業所(事業所_ID,事業所名)
部署(部署_ID,部署名)

と設計して

sql

1SELECT * FORM 2 社員 LEFT JOIN 事業所 USING(事業所_ID) 3 LEFT JOIN 部署 USING(部署_ID) 4WHERE 5 部署_ID = 1

とするが アクセスでは使えないはずなので

アクセス自体DBMSに選ばない

またあまりJOINしたくないなどの場合

マスタテーブルであるならば

sql

1SELECT 2   社員.*, 3   (SELECT 事業所名 FROM 事業所 WHERE 事業所.事業所_ID = 社員.事業所_ID) AS 事業所名, 4   (SELECT 部署名  FROM 部署  WHERE 部署.部署_ID = 社員.部署_ID) AS 部署名 5FORM 6 社員 7WHERE 8 部署_ID = 1

とする

投稿2016/08/20 04:00

編集2016/08/20 04:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

LEFT JOINを複数行う場合に括弧が必要だというのは、どうやらAccess特有のようです。

多くのDBエンジンで、LEFT JOINを複数つなげてもそのまま認識してくれるとのことです。

投稿2016/08/20 03:54

maisumakun

総合スコア145201

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問