質問編集履歴
2
具体的なテーブルを追記しました。
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文を追記しました。
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
|
このテーブルにこだわる必要はありませんので、
|