web-dev-qa-db-ja.com

MySQLのCommon Table Expressions(CTE)に相当

Microsoft SQLサーバーで実行していたクエリがあり、それは正常に機能しました。 3つのテーブルに参加したため、CTEを利用しました。内側のクエリの最初の2つは外側のクエリです。しかし、これをWebサーバーで試したところ、MySQLしかインストールされておらず、クエリを実行できませんでした。その構造でクエリを実行する方法はありますか?ここにサンプルがあります:

USE UNAMupdates;
with CTE as
( SELECT tbl_modules.module_code
FROM tbl_student
 JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
WHERE tbl_student.student_number='1002')

SELECT tbl_notifications.module_name,tbl_notifications.message,tbl_notifications.staff_username,tbl_notifications.date_time 
FROM CTE JOIN tbl_notifications
ON cte.module_code = tbl_notifications.module_code
ORDER BY tbl_notifications.date_time DESC


私が達成しようとしているのは、1人の学生が取ったすべてのモジュール/科目を照会し、その科目で利用可能な通知/ニュース項目があるかどうかを確認することです。

6
Manny265

この特定のケースでは、CTEを通常の副選択(派生テーブル)に置き換えることができます。

SELECT
  tbl_notifications.module_name,
  tbl_notifications.message,
  tbl_notifications.staff_username,
  tbl_notifications.date_time 
FROM
  (
    SELECT
      tbl_modules.module_code
    FROM
      tbl_student
      INNER JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
    WHERE
      tbl_student.student_number = '1002'
  ) AS CTE
  INNER JOIN tbl_notifications ON cte.module_code = tbl_notifications.module_code
ORDER BY
  tbl_notifications.date_time DESC
;

そして、そのクエリはSQL ServerとMySQLの両方で機能します(実際、主要なSQL製品では)。

さらに、ここではネストはまったく不要なので、次のようにしても同じ結果が得られます。

SELECT
  tbl_notifications.module_name,
  tbl_notifications.message,
  tbl_notifications.staff_username,
  tbl_notifications.date_time 
FROM
  tbl_student
  INNER JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
  INNER JOIN tbl_notifications ON tbl_modules.module_code = tbl_notifications.module_code
WHERE
  tbl_student.student_number = '1002'
ORDER BY
  tbl_notifications.date_time DESC
;

ちなみに、クエリでは短いテーブルエイリアスの使用を検討してください。これは、同じクエリが短いエイリアスでどのように見えるかです。

SELECT
  n.module_name,
  n.message,
  n.staff_username,
  n.date_time 
FROM
  tbl_student AS s
  INNER JOIN tbl_modules AS m ON s.registration_year = m.registration_year
  INNER JOIN tbl_notifications AS n ON m.module_code = n.module_code
WHERE
  s.student_number = '1002'
ORDER BY
  n.date_time DESC
;

主観的な場合もありますが、この場合は読みやすさが大幅に向上すると思います。

12
Andriy M