回答編集履歴
6
修正
answer
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
基本となる構成要素も検索対象にするならB_id[]にはB_idも含めます。
|
39
39
|
含めないならB_id[]は空にしておけば検索対象にはなりません。
|
40
40
|
|
41
|
-
で、
|
41
|
+
で、B_id[]のGinインデックスを作成し、
|
42
42
|
```
|
43
43
|
where B_id[]@>array[30,32] -- B_id[]は便宜上の表現
|
44
44
|
```
|
5
追記
answer
CHANGED
@@ -7,10 +7,12 @@
|
|
7
7
|
追記
|
8
8
|
---
|
9
9
|
以下の構造で十分な気がします。
|
10
|
+
```
|
10
11
|
TableA(A_id,Value)
|
11
12
|
TableB(B_id,Value,A_id[])
|
12
13
|
TableC(C_id,Value,A_id[])
|
13
14
|
TableBC(B_id,C_id)
|
15
|
+
```
|
14
16
|
※BCの組み合わせがあるので、BC追加。
|
15
17
|
|
16
18
|
この構造であれば、目的の件数取得は以下になります。
|
@@ -22,4 +24,22 @@
|
|
22
24
|
select count(*) from TableC where A_id[1]=1
|
23
25
|
--A_id[]をBoolean型とするなら
|
24
26
|
select count(*) from TableC where A_id[1]
|
25
|
-
```
|
27
|
+
```
|
28
|
+
追記2
|
29
|
+
--
|
30
|
+
以前提案していた構造を今回のもので表すと
|
31
|
+
```
|
32
|
+
TableA(A_id,Value)
|
33
|
+
TableB(B_id,Value,B_id[],A_id[])
|
34
|
+
```
|
35
|
+
となります。
|
36
|
+
TableBはBとCを合わせたもので、B_id[]が分子構造の構成要素になります。
|
37
|
+
元々のTableBの識別が必要なら、属性項目を持たせた方が良いでしょう。
|
38
|
+
基本となる構成要素も検索対象にするならB_id[]にはB_idも含めます。
|
39
|
+
含めないならB_id[]は空にしておけば検索対象にはなりません。
|
40
|
+
|
41
|
+
で、b_idのGinインデックスを作成し、
|
42
|
+
```
|
43
|
+
where B_id[]@>array[30,32] -- B_id[]は便宜上の表現
|
44
|
+
```
|
45
|
+
のようにすれば良いのではないかと。
|
4
修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
>
|
1
|
+
> Table BCのレコード(31, 502), (32, 502)はA_id=1由来で登録したレコードなので
|
2
2
|
|
3
3
|
このことが分かる条件が無い限り無理でしょう。
|
4
4
|
c_idが識別可能なルールで採番されているなら条件として使用できますが、
|
3
追記
answer
CHANGED
@@ -9,7 +9,9 @@
|
|
9
9
|
以下の構造で十分な気がします。
|
10
10
|
TableA(A_id,Value)
|
11
11
|
TableB(B_id,Value,A_id[])
|
12
|
-
TableC(C_id,Value,
|
12
|
+
TableC(C_id,Value,A_id[])
|
13
|
+
TableBC(B_id,C_id)
|
14
|
+
※BCの組み合わせがあるので、BC追加。
|
13
15
|
|
14
16
|
この構造であれば、目的の件数取得は以下になります。
|
15
17
|
```SQL
|
2
追記
answer
CHANGED
@@ -14,4 +14,10 @@
|
|
14
14
|
この構造であれば、目的の件数取得は以下になります。
|
15
15
|
```SQL
|
16
16
|
select count(*) from TableC where A_id @> array[1]
|
17
|
+
```
|
18
|
+
配列の個数をA_idと対比させ固定するなら以下のようになります。
|
19
|
+
```SQL
|
20
|
+
select count(*) from TableC where A_id[1]=1
|
21
|
+
--A_id[]をBoolean型とするなら
|
22
|
+
select count(*) from TableC where A_id[1]
|
17
23
|
```
|
1
追記
answer
CHANGED
@@ -2,4 +2,16 @@
|
|
2
2
|
|
3
3
|
このことが分かる条件が無い限り無理でしょう。
|
4
4
|
c_idが識別可能なルールで採番されているなら条件として使用できますが、
|
5
|
-
そうでなければ、table cにその識別が必要かと思います。
|
5
|
+
そうでなければ、table cにその識別が必要かと思います。
|
6
|
+
|
7
|
+
追記
|
8
|
+
---
|
9
|
+
以下の構造で十分な気がします。
|
10
|
+
TableA(A_id,Value)
|
11
|
+
TableB(B_id,Value,A_id[])
|
12
|
+
TableC(C_id,Value,B_id,A_id[])
|
13
|
+
|
14
|
+
この構造であれば、目的の件数取得は以下になります。
|
15
|
+
```SQL
|
16
|
+
select count(*) from TableC where A_id @> array[1]
|
17
|
+
```
|