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

回答編集履歴

15

コードミスの訂正

2016/08/08 10:16

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -38,7 +38,8 @@
38
38
  LEFT JOIN TABLE T2
39
39
  ON T2.ingredient_code = T1.cond
40
40
  HAVING
41
+ MAX(menu_code) = MIN(menu_code) -- 指摘を受け修正
41
- COUNT(*) = COUNT(menu_code)
42
+ AND COUNT(*) = COUNT(menu_code)
42
43
  ```
43
44
 
44
45
  ###補足

14

コード再修正

2016/08/08 10:16

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -38,8 +38,7 @@
38
38
  LEFT JOIN TABLE T2
39
39
  ON T2.ingredient_code = T1.cond
40
40
  HAVING
41
- MAX(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)
42
- = MIN(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)
41
+ COUNT(*) = COUNT(menu_code)
43
42
  ```
44
43
 
45
44
  ###補足

13

コードミス修正

2016/08/06 22:12

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -36,7 +36,7 @@
36
36
  'yyy'
37
37
  ) T1
38
38
  LEFT JOIN TABLE T2
39
- ON T.cond = T2.ingredient_code
39
+ ON T2.ingredient_code = T1.cond
40
40
  HAVING
41
41
  MAX(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)
42
42
  = MIN(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)

12

コード追加

2016/08/06 21:36

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -18,6 +18,30 @@
18
18
 
19
19
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・
20
20
 
21
+ **・追記**
22
+ 禁を犯してFROM句でサブクエリを用いてみました。
23
+ すごく苦しいコード・・・orz
24
+ ```SQL
25
+ SELECT
26
+ MAX(menu_code) AS menu_code
27
+ FROM
28
+ (
29
+ SELECT
30
+ 'abc' AS cond
31
+ UNION ALL
32
+ SELECT
33
+ 'xxx'
34
+ UNION ALL
35
+ SELECT
36
+ 'yyy'
37
+ ) T1
38
+ LEFT JOIN TABLE T2
39
+ ON T.cond = T2.ingredient_code
40
+ HAVING
41
+ MAX(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)
42
+ = MIN(CASE WHEN menu_code IS NOT NULL THEN id2 ELSE '0' END)
43
+ ```
44
+
21
- ###追記
45
+ ###補足
22
46
  ちなみに**FROM句**におけるサブクエリを結合する方法を用いると、
23
47
  **WHERE句**でのサブクエリ(相関副問い合わせ)と比べ高速に動作する機会は多いと思われます。

11

インデント修正

2016/08/06 21:33

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  ingredient_code IN ('abc', 'xxx', 'yyy')
14
14
  HAVING
15
15
  MAX(menu_code) = MIN(menu_code)
16
- AND COUNT(*) >= 3 -- 条件の数(※ただし「aaa」が2回など同一条件が複数指定されるとNG)
16
+ AND COUNT(*) >= 3 -- 条件の数(※ただし「aaa」が2回など同一条件が複数指定されるとNG)
17
17
  ```
18
18
 
19
19
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・

10

コメント修正

2016/08/06 19:36

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  ingredient_code IN ('abc', 'xxx', 'yyy')
14
14
  HAVING
15
15
  MAX(menu_code) = MIN(menu_code)
16
- AND COUNT(*) >= 3 -- 条件の数(※ただし「aaa」など同一条件が指定されるとNG)
16
+ AND COUNT(*) >= 3 -- 条件の数(※ただし「aaa」が2回など同一条件が複数指定されるとNG)
17
17
  ```
18
18
 
19
19
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・

9

追記・ソース修正

2016/08/06 19:33

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -2,7 +2,8 @@
2
2
  サブクエリを使わないという制約を課すなら以下のような感じでどうでしょう?
3
3
 
4
4
 
5
- **コードが存在ない場合は駄目でしたうむむ**
5
+ **もう少考えてみますが一応下記で大丈夫です。
6
+ レコードが取れない条件を入力された際の対応がどうしても思いつかない・・・**
6
7
  ```SQL
7
8
  SELECT
8
9
  MAX(menu_code) AS menu_code
@@ -11,7 +12,8 @@
11
12
  WHERE
12
13
  ingredient_code IN ('abc', 'xxx', 'yyy')
13
14
  HAVING
14
- MAX(menu_code) = MIN(menu_code)
15
+ MAX(menu_code) = MIN(menu_code)
16
+ AND COUNT(*) >= 3 -- 条件の数(※ただし「aaa」など同一の条件が指定されてるとNG)
15
17
  ```
16
18
 
17
19
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・

8

追記(検討中)

2016/08/06 19:32

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -2,8 +2,7 @@
2
2
  サブクエリを使わないという制約を課すなら以下のような感じでどうでしょう?
3
3
 
4
4
 
5
- 再度修正、これで多分けます。
5
+ **コードが存在しな場合は駄目でした、うむむ**
6
-
7
6
  ```SQL
8
7
  SELECT
9
8
  MAX(menu_code) AS menu_code

7

追記3

2016/08/06 19:18

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -16,3 +16,7 @@
16
16
  ```
17
17
 
18
18
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・
19
+
20
+ ###追記
21
+ ちなみに**FROM句**におけるサブクエリを結合する方法を用いると、
22
+ **WHERE句**でのサブクエリ(相関副問い合わせ)と比べ高速に動作する機会は多いと思われます。

6

コード修正

2016/08/06 19:11

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -2,23 +2,17 @@
2
2
  サブクエリを使わないという制約を課すなら以下のような感じでどうでしょう?
3
3
 
4
4
 
5
- 修正してみした
5
+ 再度修正、これで多分いけ
6
- **※これもあかん気がする・・・以外に難しい・・・。ちょっと実際試してきます**
6
+
7
7
  ```SQL
8
8
  SELECT
9
9
  MAX(menu_code) AS menu_code
10
10
  FROM
11
11
  TABLE
12
12
  WHERE
13
- ingredient_code IN ('abc', 'xxx')
13
+ ingredient_code IN ('abc', 'xxx', 'yyy')
14
14
  HAVING
15
- COUNT(*) = SUM(
16
- CASE
17
- WHEN MAX(menu_code) = MIN(menu_code)
15
+ MAX(menu_code) = MIN(menu_code)
18
- THEN 1
19
- ELSE 0
20
- END
21
- )
22
16
  ```
23
17
 
24
18
  ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・

5

追記

2016/08/06 18:57

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
 
5
5
  修正してみました。
6
+ **※これもあかん気がする・・・以外に難しい・・・。ちょっと実際試してきます**
6
7
  ```SQL
7
8
  SELECT
8
9
  MAX(menu_code) AS menu_code

4

ソース修正

2016/08/06 18:50

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -9,7 +9,7 @@
9
9
  FROM
10
10
  TABLE
11
11
  WHERE
12
- ngredient_code IN ('abc', 'xxx')
12
+ ingredient_code IN ('abc', 'xxx')
13
13
  HAVING
14
14
  COUNT(*) = SUM(
15
15
  CASE

3

修正

2016/08/06 18:45

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
 
5
5
  修正してみました。
6
+ ```SQL
6
7
  SELECT
7
8
  MAX(menu_code) AS menu_code
8
9
  FROM
@@ -19,4 +20,4 @@
19
20
  )
20
21
  ```
21
22
 
22
- ただ集約とHAVING句を使うからむしろパフォーマンスが悪いかも・・・
23
+ ただ集約関数使いまくるのとHAVING句を使うからむしろパフォーマンスが悪いかも・・・

2

ソースミス修正

2016/08/06 18:44

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -2,19 +2,21 @@
2
2
  サブクエリを使わないという制約を課すなら以下のような感じでどうでしょう?
3
3
 
4
4
 
5
- **※普通にミスってた再考します・・・**
6
- ```SQL
5
+ 修正してみました。
7
6
  SELECT
8
- MAX(menu_code) AS menu_code
7
+ MAX(menu_code) AS menu_code
9
8
  FROM
10
- table
9
+ TABLE
11
10
  WHERE
12
- ngredient_code IN ('abc', 'xxx')
11
+ ngredient_code IN ('abc', 'xxx')
13
-
14
- GROUP BY
15
- ingredient_code
16
12
  HAVING
13
+ COUNT(*) = SUM(
14
+ CASE
17
- MAX(menu_code) = MIN(menu_code)
15
+ WHEN MAX(menu_code) = MIN(menu_code)
16
+ THEN 1
17
+ ELSE 0
18
+ END
19
+ )
18
20
  ```
19
21
 
20
22
  ただ集約とHAVING句を使うからむしろパフォーマンスが悪いかも・・・

1

追記

2016/08/06 18:43

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -1,7 +1,8 @@
1
1
  サブクエリが一概にパフォーマンスを悪化させるって訳でもないのですが、
2
2
  サブクエリを使わないという制約を課すなら以下のような感じでどうでしょう?
3
3
 
4
+
4
- 動作確認は未実施
5
+ **普通にミスってた再考します・・・**
5
6
  ```SQL
6
7
  SELECT
7
8
  MAX(menu_code) AS menu_code
@@ -16,4 +17,4 @@
16
17
  MAX(menu_code) = MIN(menu_code)
17
18
  ```
18
19
 
19
- ただ集約とHAVING句を使うからむしろパフォーマンスが悪いかも・・・
20
+ ただ集約とHAVING句を使うからむしろパフォーマンスが悪いかも・・・