teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

説明追記

2019/11/25 02:52

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -52,4 +52,13 @@
52
52
  | 2 | 1 |
53
53
  | 3 | 1 |
54
54
 
55
- このような設計にすれば、「文書マスター」クエリのような複雑なSQLは不必要になりますし、データとして格段に扱いやすくなるはずです。
55
+ このような設計にすれば、「文書マスター」クエリのような複雑なSQLは不必要になりますし、データとして格段に扱いやすくなるはずです。
56
+
57
+ ---
58
+ あと、**廃止済み** フィールドで、存続, 廃止済み, 状況不明 という3つの状況を記録したいなら、Yes/No型でなく、数値型にして、
59
+ 0:存続
60
+ 1:廃止済み
61
+ 2:状況不明
62
+ というようにするのが意味か明確になると思います。
63
+ Nullだと、状況不明なのか入力忘れなのか曖昧になります。
64
+ 入力方法としてはコンボボックスとかオプショングループにすると分かりやすくなります。

1

追記

2019/11/25 02:52

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -12,4 +12,44 @@
12
12
  クエリ表示結果
13
13
  ![イメージ説明](f92b8c96de259bef2f771910d04f505e.png)
14
14
 
15
- チェックボックスが ■ はNull
15
+ チェックボックスが ■ はNull
16
+
17
+ 追記
18
+ ---
19
+ 編集、追記されたテーフル情報、SQLをみて
20
+ クエリと結合するとFalseになることを確認しました。
21
+ 下記のようなSQLで対処することになりそうです。
22
+
23
+ ```sql
24
+ SELECT a.*, IIf(b.文書番号 Is Null,Null,b.廃止済) AS 廃止済
25
+ FROM 文書マスタ AS a LEFT JOIN 文書廃止テーブル AS b ON a.文書番号=b.文書番号;
26
+ ```
27
+ ただ、そもそものテーブル設計が間違っていると思います。
28
+
29
+ **文書番号** と **REV** は一対多の関係です。
30
+ また、**文書番号** と **廃止済** は一対一の関係です。
31
+
32
+ 一対多の関係のデータはテーブルを分割すべきです。
33
+ 一対一の関係のデータはひとつのテーブルにまとめるべきです。
34
+ これはデータベース設計のセオリーです。
35
+
36
+ 上記を考慮すると下記のような設計になります。
37
+
38
+ 文書マスター
39
+
40
+ | 文書番号 | タイトル | 廃止済み |
41
+ |----------|------------|----------|
42
+ | 1 | 取扱説明書 | True |
43
+ | 2 | 仕様書 | False |
44
+ | 3 | 領収書 | Null |
45
+
46
+ 文書Rev管理
47
+
48
+ | 文書番号 | rev |
49
+ |----------|-----|
50
+ | 1 | 1 |
51
+ | 1 | 2 |
52
+ | 2 | 1 |
53
+ | 3 | 1 |
54
+
55
+ このような設計にすれば、「文書マスター」クエリのような複雑なSQLは不必要になりますし、データとして格段に扱いやすくなるはずです。