web-dev-qa-db-fra.com

L'équivalent des expressions de table communes (CTES) dans MySQL

J'ai une requête que j'exécutit avec Microsoft SQL Server et cela a bien fonctionné. Il a utilisé des CTES parce que j'ai rejoint trois tables. Les deux premiers dans une requête interne puis externe. Cependant, lorsque j'ai essayé cela sur mon serveur Web, il n'a que MySQL installé et je ne pouvais pas exécuter la requête. Y a-t-il un moyen de faire fonctionner une requête avec cette structure? Voici un échantillon:

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


[.

6
Manny265

Dans ce cas particulier, le CTE pourrait être remplacé par un sous-sélection normal (une table dérivée):

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
;

Et cette requête fonctionnerait à la fois dans SQL Server et MySQL (dans n'importe quel produit SQL majeur, en fait).

De plus, la nidification est inutile ici du tout, et vous pourriez donc avoir le même résultat avec ce qui suit:

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
;

Et au fait, veuillez envisager d'utiliser des alias de table courts dans vos questions. Voici à quoi ressemble la même requête avec de courts alias:

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
;

Cela peut être subjectif parfois, mais je crois que dans cette affaire la lisibilité s'améliore grandement.

12
Andriy M