Man*_*265 7 mysql sql-server cte
我有一个在 Microsoft SQL 服务器中运行的查询,它运行良好。它使用了 CTE,因为我加入了三个表。内部查询中的前两个,然后是外部查询。然而,当我在我的网络服务器上尝试这个时,它只安装了 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
Run Code Online (Sandbox Code Playgroud)
我想要实现的是查询单个学生选择的所有模块/主题,然后找出该主题是否有任何通知/新闻项目可用。
And*_*y M 12
在这种特殊情况下,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
;
Run Code Online (Sandbox Code Playgroud)
并且该查询在 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
;
Run Code Online (Sandbox Code Playgroud)
顺便说一下,请考虑在您的查询中使用短表别名。以下是使用短别名的相同查询的样子:
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
;
Run Code Online (Sandbox Code Playgroud)
有时这可能是主观的,但我相信在这种情况下可读性大大提高。
| 归档时间: |
|
| 查看次数: |
15131 次 |
| 最近记录: |