回答編集履歴
1
回答を修正
test
CHANGED
@@ -21,3 +21,57 @@
|
|
21
21
|
WHERE AB1.A_id = AB2.A_id AND AB1.A_id = 1;
|
22
22
|
|
23
23
|
```
|
24
|
+
|
25
|
+
---
|
26
|
+
|
27
|
+
追記:
|
28
|
+
|
29
|
+
せっかく具体例をご提示いただいたのですが、上手な方法は思いつきませんでした。
|
30
|
+
|
31
|
+
後々のことを考えると列を増やすのは確かに得策ではないと感じましたので
|
32
|
+
|
33
|
+
もともとのデータ構造で実現するとしたら、ということで下記のように考えてみました。
|
34
|
+
|
35
|
+
もしかしたら、組み合わせの列挙方法がご想定のものとは異なるかもものになっているかもしれません。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
```SQL
|
40
|
+
|
41
|
+
SELECT BC1.c_id FROM BC BC1
|
42
|
+
|
43
|
+
INNER JOIN BC BC2 ON BC1.C_id = BC2.C_id AND BC1.B_id < BC2.B_id
|
44
|
+
|
45
|
+
LEFT JOIN BC BC3 ON BC1.C_id = BC3.C_id AND BC2.B_id < BC3.B_id
|
46
|
+
|
47
|
+
INNER JOIN AB AB1 ON BC1.B_id = AB1.B_id
|
48
|
+
|
49
|
+
INNER JOIN AB AB2 ON BC2.B_id = AB2.B_id
|
50
|
+
|
51
|
+
LEFT JOIN AB AB3 ON BC3.B_id = AB3.B_id
|
52
|
+
|
53
|
+
WHERE (BC3.c_id IS NOT NULL OR BC1.c_id NOT IN (
|
54
|
+
|
55
|
+
SELECT BC1.c_id FROM BC BC1
|
56
|
+
|
57
|
+
INNER JOIN BC BC2 ON BC1.C_id = BC2.C_id AND BC1.B_id < BC2.B_id
|
58
|
+
|
59
|
+
INNER JOIN BC BC3 ON BC1.C_id = BC3.C_id AND BC2.B_id < BC3.B_id
|
60
|
+
|
61
|
+
))
|
62
|
+
|
63
|
+
AND AB1.A_id = AB2.A_id
|
64
|
+
|
65
|
+
AND
|
66
|
+
|
67
|
+
(
|
68
|
+
|
69
|
+
(BC3.B_id IS NOT NULL AND AB3.B_id IS NOT NULL AND AB1.A_id = AB3.A_id)
|
70
|
+
|
71
|
+
OR (BC3.B_id IS NULL AND AB3.B_id IS NULL)
|
72
|
+
|
73
|
+
)
|
74
|
+
|
75
|
+
AND AB1.A_id = 1;
|
76
|
+
|
77
|
+
```
|