こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

【達人に学ぶSQL徹底指南書】についての質問

【達人に学ぶSQL徹底指南書】という本の以下のSQLについての質問です。
----------------------------------------
--【95ページのSQL】
--算数の点数が80点以上かつ
--国語の点数が50点以上の生徒を取得
----------------------------------------
SELECT
  DISTINCT student_id
FROM
  TestScores TS1
WHERE
  subject IN('算数','国語')
  AND NOT EXISTS(
    SELECT
      *
    FROM
      TestScores TS2
    WHERE
      TS2.student_id = TS1.student_id
      AND 1 = CASE WHEN subject = '算数' AND score < 80 THEN 1
           WHEN subject = '国語' AND score < 50 THEN 1
           ELSE 0 END
  )

このSQLの
----------------------------------------------------------
AND 1 = CASE WHEN subject = '算数' AND score < 80 THEN 1
     WHEN subject = '国語' AND score < 50 THEN 1
     ELSE 0 END
----------------------------------------------------------

----------------------------------------------------------
AND ((subject = '算数' AND score < 80)
  OR (subject = '国語' AND score < 50))
----------------------------------------------------------
と同じ意味ですよね?

CASE式を使っている意味は何かあるのでしょうか?
他のSQLにも同様にORに書き換えられそうなところがあったので何か意味があるのかなと思ったのですが。

投稿日時 - 2020-03-03 22:37:39

QNo.9719369

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

データのスキャン回数が違うかな。
subject = '算数' AND score < 80 で1回
subject = '国語' AND score < 50 で1回  計2回

AND 1 = CASE WHEN subject = '算数' AND score < 80 THEN 1
     WHEN subject = '国語' AND score < 50 THEN 1
     ELSE 0 END は1回

データが100万件とかになると格段に変わってきます。

投稿日時 - 2020-03-03 22:43:40

あなたにオススメの質問