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人の学生が取ったすべてのモジュール/科目を照会し、その科目で利用可能な通知/ニュース項目があるかどうかを確認することです。
この特定のケースでは、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
;
主観的な場合もありますが、この場合は読みやすさが大幅に向上すると思います。