SQL 为嵌套选择创建别名列?

Posted

技术标签:

【中文标题】SQL 为嵌套选择创建别名列?【英文标题】:SQL Creating an Alias Column For a Nested Select? 【发布时间】:2012-04-27 18:11:47 【问题描述】:

假设我有一个Person 表和一个Courses 表。在Person 表中,我有PersonName 列。在Courses 表中,假设我有CourseTitlePersonNameCourseDifficultyCourseDifficulty 是 1-4(4 是最难的)。我如何返回来自Person 的人员列表,并且每个人都有一个列显示他们正在通过CourseTitle 参加的最困难的课程。

据我所知,我会通过执行以下操作来获得 Brett 上最难的课程的 CourseTitle:

SELECT CourseTitle 
FROM Courses 
WHERE PersonName = 'Brett' 
  AND CourseDifficulty = (SELECT MAX(CourseDifficulty) 
                          FROM Courses 
                          WHERE PersonName='Brett')

但是如何为 Person 表中的每个人运行它?我希望结果类似于

Brett-SQL For Dummies 4
Tim-Quantum Mechanics
Jane-Thermodynamics 2

对不起,菜鸟。提前感谢您的帮助!

【问题讨论】:

如果学生有超过 1 门“最难的课程”,您希望发生什么。 (哦,这是作业吗?) 不,这是为了工作。我有一个更复杂的场景,但这是我在最基本的层面上需要做的。在这种情况下,没有人会选择任何两门难度相同的课程 【参考方案1】:

你可以使用以下

SELECT p.name ,p.address, c.courseTitle ,c.courseDifficulty FROM (
        SELECT personName, courseTitle, MAX(courseDifficulty) AS courseDifficulty
        FROM course
        GROUP BY personName 
) AS c RIGHT JOIN person AS p ON p.name = c.personName

这里假设 personName 是唯一的。否则,您可以在此处使用唯一 id 代替人名,并在 select 语句中添加此字段。

【讨论】:

啊,您可以使用 select AS X 然后将 X 加入另一个表。我认为这将为我做这件事。我会尝试并回复你【参考方案2】:

试试这个:

SELECT c.CourseTitle, c.PersonName, c.CourseDifficulty
  FROM Courses c
 WHERE c.CourseDifficulty=(SELECT MAX(c2.CourseDifficulty) FROM Courses c2 WHERE c2.PersonName=c.PersonName)

【讨论】:

如果 Brett 最难的课程是 3,而 Bob 最难的课程是 4。如果只返回 4,Brett 将被排除在外。我可能读错了 我继续尝试。在 Courses 表中的 1186 条记录中,我得到了 964 条,它返回了所有不同的 CourseDifficulty 1 到 4,而且每个人的 PersonName 列并不不同。 这个 SQL 应该只返回那些对记录中的人来说最难的课程的记录。但是,如果一个人有多个相同最大难度级别的课程,它将返回所有课程。我认为这就是为什么您要为同一个人返回倍数......在这种情况下应该返回什么? 在这种情况下,任何人的两门课程都没有相同的难度等级。

以上是关于SQL 为嵌套选择创建别名列?的主要内容,如果未能解决你的问题,请参考以下文章

WHERE 语句中的 SQL Server AS 语句别名列

如何在laravel eloquent中为左连接表起别名

MySQL别名列通配符[重复]

SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird

CONCAT 或 APPEND T-SQL 中的两个别名列

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?