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

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

詳細はこちら
Access

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

SQL

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

Q&A

解決済

1回答

4432閲覧

Access テーブルでyes/no型をjoinしたときnullにしたい

tokita.

総合スコア61

Access

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

SQL

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

0グッド

0クリップ

投稿2019/11/25 00:30

編集2019/11/25 01:43

Access2007において、データなしを外部結合したときデータがnullになるようにしたいです。

文書マスタ

文書番号タイトル
1取扱説明書
2仕様書
3領収書

文書廃止テーブル

文書番号廃止済
1true
2false

(3番は状況不明であり未登録)

このとき、文書マスタに文書廃止テーブルをleft joinしたとき以下のようになってほしいです。
が、廃止済をyes/noで定義するとfalseが入ってしまい、実情と違うデータになってしまいます。

文書番号タイトル廃止済
1取扱説明書true
2仕様書false
3領収書null

Accessのフォームにおけるチェックボックスではトリプルステートがつかえるようなのですが、
ここにける「廃止済」のような情報で(tableやクエリ上において)nullを許容するyes/no型というものを実現する方法はあるのでしょうか。


文書マスタが下のようなものでした。
文書Rev管理テーブル

文書番号タイトルrev
1取扱説明書1
1取扱説明書2
2仕様書1
3領収書1

文書マスタ (マスタと名前を付けているのにクエリでした、すみません。)

SQL

1SELECT B.文書番号, B.タイトル 2FROM (SELECT 文書番号, max(rev) AS mRev FROM 文書Rev管理 GROUP BY 文書番号) AS A LEFT JOIN 文書Rev管理 AS B ON (A.mRev=B.Rev) AND (A.文書番号=B.文書番号);

問題のクエリ

SQL

1SELECT a.*, b.廃止済 2FROM 文書マスタ AS a LEFT JOIN 文書廃止テーブル AS b ON a.文書番号=b.文書番号;

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通に LEFT JOIN でデータ無しはNullになります。
Falseになっているというのはどのように確認しましたか。

また、実際のSQLも提示してください。

当方で実験したSQL

sql

1SELECT 文書マスタ.文書番号, 文書マスタ.[タイトル], 文書廃止テーブル.廃止済 2FROM 文書マスタ LEFT JOIN 文書廃止テーブル ON 文書マスタ.文書番号 = 文書廃止テーブル.文書番号;

クエリ表示結果
イメージ説明

チェックボックスが ■ はNull

追記

編集、追記されたテーフル情報、SQLをみて
クエリと結合するとFalseになることを確認しました。
下記のようなSQLで対処することになりそうです。

sql

1SELECT a.*, IIf(b.文書番号 Is Null,Null,b.廃止済) AS 廃止済 2FROM 文書マスタ AS a LEFT JOIN 文書廃止テーブル AS b ON a.文書番号=b.文書番号;

ただ、そもそものテーブル設計が間違っていると思います。

文書番号REV は一対多の関係です。
また、文書番号廃止済 は一対一の関係です。

一対多の関係のデータはテーブルを分割すべきです。
一対一の関係のデータはひとつのテーブルにまとめるべきです。
これはデータベース設計のセオリーです。

上記を考慮すると下記のような設計になります。

文書マスター

文書番号タイトル廃止済み
1取扱説明書True
2仕様書False
3領収書Null

文書Rev管理

文書番号rev
11
12
21
31

このような設計にすれば、「文書マスター」クエリのような複雑なSQLは不必要になりますし、データとして格段に扱いやすくなるはずです。


あと、廃止済み フィールドで、存続, 廃止済み, 状況不明 という3つの状況を記録したいなら、Yes/No型でなく、数値型にして、
0:存続
1:廃止済み
2:状況不明
というようにするのが意味か明確になると思います。
Nullだと、状況不明なのか入力忘れなのか曖昧になります。
入力方法としてはコンボボックスとかオプショングループにすると分かりやすくなります。

投稿2019/11/25 01:11

編集2019/11/25 02:52
hatena19

総合スコア34073

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

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

tokita.

2019/11/25 01:45

回答ありがとうございます。 おっしゃる通り、文書マスタが正しくマスタテーブルなら問題は起きないようです。 実は文書マスタと謳っていたものが別のテーブルを集計したクエリでした。 質問が不適当で申し訳ありません。
tokita.

2019/11/25 03:29

追記ありがとうございます。 文書番号でnullを確認すれば確かに動きました。 テーブル設計に関しては、最近変な苦労をたくさんしているので、見直しを検討します。 ところで、質問表題とは別の質問になるのですが、 このDBでは、Revごとに様々な情報があり、それを全部保管しつつ、 実際の操作では最新Revの情報のみ見るということがしばしば求められます。 この場合、文書マスターと最新Revを関連付ける方法としては、 方法1. 文章番号と最新のRevを1:1で関連付けるテーブルを作成して、Revデータが増えるたびに関連付け用テーブルを同時にupdateする 方法2. 文書マスターに最新Revを記録するフィールドを設けて、Revデータが増えるたびに文書マスターテーブルを同時にupdateする 方法3. 上のような情報は保管せずに、結合時、上質問で文書Rev管理テーブルに対してやっていたようなSQLを使って最新を取得する 方法4. Revテーブルに最新Revを識別するフィールドを設けて、Revデータが増えるたびに前のRevデータの識別をoffにする というような方法があると考えました。 方法1,2では登録時に2つのテーブルに処理が必要になる 方法3では呼び出し時に複雑なSQLが残る 方法4では同じテーブルであるものの登録時にinsertとupdateを要する(手間としては方法1,2とあまり変わらない) と一長一短で、悩んでおります。どういった方法が好ましく思われますか?
hatena19

2019/11/25 04:59

文書に関するデータで、 一つの文書(文書番号)に対して、 一つしかないデータ、一つあればよいデータは文書マスタに。 一つの文書(文書番号)に対して、変更の履歴(Revデータ)を残しておく必要があるデータは文書Rev管理に。 と考えればいいでしょう。 文書番号に対して、最新のRevデータを取り出すには、サブクエリやDMax関数を抽出条件にするとか、SQLを工夫すれば可能です。 ただ、複雑になったり、重い処理になる可能性もあるので、文書マスタ の方に最新Rev番号フィールドを持たせるのもありだと思います。 これなら、文書番号同士、最新RevとRevを結合するクエリで簡単に目的のデータを取得できます。 方法2 になりますね。 「Revデータが増えるたびに文書マスターテーブルを同時にupdateする」の部分は、 Revデータを入力する場合は、メインフォームのソースを文書マスタ、サブフォームのソースを Revデータにしておいて、サブフォームの新規レコード追加時に、VBAでメインフォームの最新Rev番号を更新するようにすればいいでしょう。
tokita.

2019/11/25 06:43

よくわかりました。 その方法でやってみようと思います ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問