SQL 为嵌套选择创建别名列?
Posted
技术标签:
【中文标题】SQL 为嵌套选择创建别名列?【英文标题】:SQL Creating an Alias Column For a Nested Select? 【发布时间】:2012-04-27 18:11:47 【问题描述】:假设我有一个Person
表和一个Courses
表。在Person
表中,我有PersonName
列。在Courses
表中,假设我有CourseTitle
、PersonName
和CourseDifficulty
。 CourseDifficulty
是 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 语句别名列
SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?