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

質問編集履歴

2

具体的なテーブルを追記しました。

2017/10/03 02:37

投稿

acre_maker
acre_maker

スコア145

title CHANGED
File without changes
body CHANGED
@@ -108,4 +108,19 @@
108
108
  ご指導ご鞭撻よろしくお願いします。
109
109
 
110
110
  ###補足情報
111
- PostgreSQL (version9.5.7)
111
+ PostgreSQL (version9.5.7)
112
+
113
+ ###追記
114
+ 専門的なことをしているので、抽象的に書いたほうがわかりやすいと思いましたが、
115
+ かえってわかりにくいという印象を与えてしまったようなので、
116
+ 具体的なテーブルも下に書いておきます。
117
+
118
+ 化学構造のデータを扱っていまして
119
+
120
+ A: 化学構造を含むライブラリ(データベース)名
121
+ B: 化学構造自体のレコード
122
+ AB: 複数のライブラリが同じ化学構造を含むことがあるためこのような形でリレーション
123
+ C: Bの化学構造のうちの2あるいは3個を組み合わせた新規の化学構造
124
+ BC: Cの新規の化学構造のために組み合わせたBの化学構造
125
+
126
+ となっております。

1

レコード増やしてSQL文を追記しました。

2017/10/03 02:37

投稿

acre_maker
acre_maker

スコア145

title CHANGED
File without changes
body CHANGED
@@ -16,8 +16,31 @@
16
16
  それとリレーションのあるTable AB→Table B→Table BC→Table Cとたどり、
17
17
  最終的にリレーションのあるTable Cの数をカウントしたいです。
18
18
 
19
+ **追記**
20
+ 例えば以下の例では
21
+
22
+ A_id=1に関しては、Table CのC_id=500, 501, 502の3つを検索ヒットし
23
+ C_id=503, 504は検索ヒットしたくありません。
24
+ (A_id=1はB_id=33, 34とリレーションがないため)
25
+
26
+ A_id=2に関しては、Table CのC_id=500の1つを検索ヒットし
27
+ C_id=501, 502, 503, 504は検索ヒットしたくありません。
28
+ (A_id=2はB_id=32, 33, 34とリレーションがないため)
29
+
30
+ A_id=3に関しては、Table CのC_id=503, 504, 505の3つを検索ヒットし
31
+ C_id=500, 502は検索ヒットしたくありません。
32
+ (A_id=3はB_id=30, 32とリレーションがないため)
33
+
19
34
  ###発生している問題・エラーメッセージ
35
+ **追記**
36
+ 単純に中間テーブルを用いたSQL文を以下のように考えました。
37
+ ```sql
38
+ SELECT COUNT(DISTINCT(C_id)) FROM BC WHERE B_id in (
39
+ SELECT B_id FROM AB WHERE A_id = 1
40
+ )
41
+ ```
42
+
20
- 自分で考えたSQL文では
43
+ しかし、この自分で考えたSQL文では
21
44
  以下のようなリレーションがある時、A_id=2を満たすBのB_idを取得して、
22
45
  そのB_idを含むTable Cという単純な条件で検索をすると(31, 502)のレコードも
23
46
  ヒットしてしまいます。
@@ -30,6 +53,7 @@
30
53
  |:--|:--|
31
54
  |1|foo|
32
55
  |2|baz|
56
+ |3|bar|
33
57
 
34
58
  Table B
35
59
  |B_id|value|
@@ -37,6 +61,8 @@
37
61
  |30|-1|
38
62
  |31|-2|
39
63
  |32|-3|
64
+ |33|-4|
65
+ |34|-5|
40
66
 
41
67
  Table AB
42
68
  |A_id|B_id|
@@ -46,6 +72,9 @@
46
72
  |1|32|
47
73
  |2|30|
48
74
  |2|31|
75
+ |3|31|
76
+ |3|33|
77
+ |3|34|
49
78
 
50
79
  Table C
51
80
  |C_id|value|
@@ -53,6 +82,9 @@
53
82
  |500|Alice|
54
83
  |501|Bob|
55
84
  |502|Chris|
85
+ |503|Dylan|
86
+ |504|Emily|
87
+ |505|Franc|
56
88
 
57
89
  Table BC
58
90
  |B_id|C_id|
@@ -63,6 +95,12 @@
63
95
  |32|501|
64
96
  |31|502|
65
97
  |32|502|
98
+ |31|503|
99
+ |33|503|
100
+ |31|504|
101
+ |34|504|
102
+ |33|505|
103
+ |34|505|
66
104
 
67
105
  どのようにすれば、私が望むように検索ヒットすることができるでしょうか?
68
106
  このテーブルにこだわる必要はありませんので、