回答編集履歴

4

コード修正

2015/08/11 23:43

投稿

hirohiro
hirohiro

スコア2068

test CHANGED
@@ -58,7 +58,9 @@
58
58
 
59
59
  AND r1.res.reservation_date < r2.res.reservation_date
60
60
 
61
+ )
62
+
61
- ) res ON cos.costomer_id = res.costomer_id
63
+ ) res ON cos.costomer_id = res.costomer_id
62
64
 
63
65
  ORDER BY res.reservation_date DESC
64
66
 

3

コード修正

2015/08/11 23:43

投稿

hirohiro
hirohiro

スコア2068

test CHANGED
@@ -108,7 +108,9 @@
108
108
 
109
109
  AND r1.reservation_date < r2.reservation_date
110
110
 
111
+ )
112
+
111
- ) res ON cos.costomer_id = res.costomer_id
113
+ ) res ON cos.costomer_id = res.costomer_id
112
114
 
113
115
  )
114
116
 

2

コード修正

2015/08/11 23:41

投稿

hirohiro
hirohiro

スコア2068

test CHANGED
@@ -70,13 +70,15 @@
70
70
 
71
71
  ```SQL
72
72
 
73
- SELECT cos.*, res.*
73
+ (SELECT cos.*, res.*
74
74
 
75
- FROM costomer cos
75
+ FROM costomer cos
76
76
 
77
- INNER JOIN costomer_reservation res ON cos.costomer_id = res.costomer_id
77
+ INNER JOIN costomer_reservation res ON cos.costomer_id = res.costomer_id
78
78
 
79
- WHERE res.reservation_date >= CURRENT_DATE
79
+ WHERE res.reservation_date >= CURRENT_DATE
80
+
81
+ )
80
82
 
81
83
 
82
84
 
@@ -84,29 +86,31 @@
84
86
 
85
87
 
86
88
 
87
- SELECT cos.*, res.*
89
+ (SELECT cos.*, res.*
88
90
 
89
- FROM costomer cos
91
+ FROM costomer cos
90
92
 
91
- INNER JOIN (
93
+ INNER JOIN (
92
94
 
93
- SELECT *
95
+ SELECT *
94
96
 
95
- FROM costomer_reservation r1
97
+ FROM costomer_reservation r1
96
98
 
97
- WHERE NOT EXISTS (
99
+ WHERE NOT EXISTS (
98
100
 
99
- SELECT *
101
+ SELECT *
100
102
 
101
- FROM costomer_reservation r2
103
+ FROM costomer_reservation r2
102
104
 
103
- WHERE r1.costomer_id = r2.costomer_id
105
+ WHERE r1.costomer_id = r2.costomer_id
104
106
 
105
- AND r1.reservation_date < CURRENT_DATE
107
+ AND r1.reservation_date < CURRENT_DATE
106
108
 
107
- AND r1.reservation_date < r2.reservation_date
109
+ AND r1.reservation_date < r2.reservation_date
108
110
 
109
- ) res ON cos.costomer_id = res.costomer_id
111
+ ) res ON cos.costomer_id = res.costomer_id
112
+
113
+ )
110
114
 
111
115
 
112
116
 

1

追記

2015/08/11 23:36

投稿

hirohiro
hirohiro

スコア2068

test CHANGED
@@ -1 +1,131 @@
1
1
  1と2で条件がかなり異なるので、多少コードが長くなってもSQLを2つ作ってUNIONで繋げたほうが、メンテナンスがやりやすくなるかも知れませんね。
2
+
3
+
4
+
5
+ ###2015/8/12追記
6
+
7
+ > 同じ名前の項目があると、取り出せないですよね?
8
+
9
+ 縦につなげるだけなので、要素数や要素名は普通にSELECTした場合と同じだと思うのですが、
10
+
11
+ reservation_dateが2つになるというのはどんな時でしょう?
12
+
13
+
14
+
15
+ 抽出条件に従うと
16
+
17
+ 条件1(と3)を抽出するSQLはこんな感じ
18
+
19
+ ```SQL
20
+
21
+ SELECT cos.*, res.*
22
+
23
+ FROM costomer cos
24
+
25
+ INNER JOIN costomer_reservation res ON cos.costomer_id = res.costomer_id
26
+
27
+ WHERE res.reservation_date >= CURRENT_DATE
28
+
29
+ ORDER BY res.reservation_date DESC
30
+
31
+ ```
32
+
33
+
34
+
35
+ 条件2(と3)を抽出するSQLはこんな感じ
36
+
37
+ ```SQL
38
+
39
+ SELECT cos.*, res.*
40
+
41
+ FROM costomer cos
42
+
43
+ INNER JOIN (
44
+
45
+ SELECT *
46
+
47
+ FROM costomer_reservation r1
48
+
49
+ WHERE NOT EXISTS (
50
+
51
+ SELECT *
52
+
53
+ FROM costomer_reservation r2
54
+
55
+ WHERE r1.costomer_id = r2.costomer_id
56
+
57
+ AND r1.reservation_date < CURRENT_DATE
58
+
59
+ AND r1.res.reservation_date < r2.res.reservation_date
60
+
61
+ ) res ON cos.costomer_id = res.costomer_id
62
+
63
+ ORDER BY res.reservation_date DESC
64
+
65
+ ```
66
+
67
+
68
+
69
+ UNIONで繋ぐとこんな感じ
70
+
71
+ ```SQL
72
+
73
+ SELECT cos.*, res.*
74
+
75
+ FROM costomer cos
76
+
77
+ INNER JOIN costomer_reservation res ON cos.costomer_id = res.costomer_id
78
+
79
+ WHERE res.reservation_date >= CURRENT_DATE
80
+
81
+
82
+
83
+ UNION
84
+
85
+
86
+
87
+ SELECT cos.*, res.*
88
+
89
+ FROM costomer cos
90
+
91
+ INNER JOIN (
92
+
93
+ SELECT *
94
+
95
+ FROM costomer_reservation r1
96
+
97
+ WHERE NOT EXISTS (
98
+
99
+ SELECT *
100
+
101
+ FROM costomer_reservation r2
102
+
103
+ WHERE r1.costomer_id = r2.costomer_id
104
+
105
+ AND r1.reservation_date < CURRENT_DATE
106
+
107
+ AND r1.reservation_date < r2.reservation_date
108
+
109
+ ) res ON cos.costomer_id = res.costomer_id
110
+
111
+
112
+
113
+ ORDER BY res.reservation_date DESC
114
+
115
+ ```
116
+
117
+
118
+
119
+ 要素が同じなら抵抗無く連結できると思います。
120
+
121
+
122
+
123
+ ※動作テストはしていないのでエラーがあるかも知れません。
124
+
125
+ ※フラグやクリニックチェックは条件に無かったので省いています
126
+
127
+ ※条件2の方は、costomer_idとreservation_dateの2つがまったく同じレコードは無い前提です。
128
+
129
+ ※条件2の方は相関サブクエリを使っており、レコードが多い場合は別の方法にしないと異様に遅いかも知れません。
130
+
131
+