質問: Access2007において、データなしを外部結合したときデータがnullになるようにしたいです。 文書マスタ | 文書番号 | タイトル | | --- | --- | | 1 | 取扱説明書 | | 2 | 仕様書 | | 3 | 領収書 | 文書廃止テーブル | 文書番号 | 廃止済 | | --- | --- | | 1 | true | | 2 | false | (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 | 文書マスタ (マスタと名前を付けているのにクエリでした、すみません。) ``` SELECT B.文書番号, B.タイトル FROM (SELECT 文書番号, max(rev) AS mRev FROM 文書Rev管理 GROUP BY 文書番号) AS A LEFT JOIN 文書Rev管理 AS B ON (A.mRev=B.Rev) AND (A.文書番号=B.文書番号); ``` 問題のクエリ ``` SELECT a.*, b.廃止済 FROM 文書マスタ AS a LEFT JOIN 文書廃止テーブル AS b ON a.文書番号=b.文書番号; ```
回答: 普通に LEFT JOIN でデータ無しはNullになります。 Falseになっているというのはどのように確認しましたか。 また、実際のSQLも提示してください。 当方で実験したSQL ``` SELECT 文書マスタ.文書番号, 文書マスタ.タイトル], 文書廃止テーブル.廃止済 FROM 文書マスタ LEFT JOIN 文書廃止テーブル ON 文書マスタ.文書番号 = 文書廃止テーブル.文書番号; ``` クエリ表示結果 ![イメージ説明 チェックボックスが ■ はNull 追記 編集、追記されたテーフル情報、SQLをみて クエリと結合するとFalseになることを確認しました。 下記のようなSQLで対処することになりそうです。 ``` SELECT a.*, IIf(b.文書番号 Is Null,Null,b.廃止済) AS 廃止済 FROM 文書マスタ AS a LEFT JOIN 文書廃止テーブル AS b ON a.文書番号=b.文書番号; ``` ただ、そもそものテーブル設計が間違っていると思います。 **文書番号** と **REV** は一対多の関係です。 また、**文書番号** と **廃止済** は一対一の関係です。 一対多の関係のデータはテーブルを分割すべきです。 一対一の関係のデータはひとつのテーブルにまとめるべきです。 これはデータベース設計のセオリーです。 上記を考慮すると下記のような設計になります。 文書マスター | 文書番号 | タイトル | 廃止済み | | --- | --- | --- | | 1 | 取扱説明書 | True | | 2 | 仕様書 | False | | 3 | 領収書 | Null | 文書Rev管理 | 文書番号 | rev | | --- | --- | | 1 | 1 | | 1 | 2 | | 2 | 1 | | 3 | 1 | このような設計にすれば、「文書マスター」クエリのような複雑なSQLは不必要になりますし、データとして格段に扱いやすくなるはずです。 あと、**廃止済み** フィールドで、存続, 廃止済み, 状況不明 という3つの状況を記録したいなら、Yes/No型でなく、数値型にして、 0:存続 1:廃止済み 2:状況不明 というようにするのが意味か明確になると思います。 Nullだと、状況不明なのか入力忘れなのか曖昧になります。 入力方法としてはコンボボックスとかオプショングループにすると分かりやすくなります。