我目前正在参加DBS课程,我正在研究内联视图:
SELECT userId, firstname, lastname, gender
FROM
(SELECT COUNT(dvdId) dvdId, u.userId
FROM userDVD
JOIN users u ON userDVD.userId = u.userId
GROUP BY userId) as T
WHERE gender = 'F';
当我运行Query时,它返回字段列表中的错误未知列。如果我尝试指定
u.firstname, u.lastname, u.gender
我返回相同的错误。有什么想法吗?
答案 0 :(得分:1)
SELECT T.userId, T.firstname, T.lastname, T.gender
FROM (
SELECT users.userId, users.firstname, users.lastname, users.gender
FROM userDVD
JOIN users ON userDVD.userId = users.userId
WHERE gender = 'F' GROUP BY userId
) as T;
我完成了它,结果我没有意识到,因为我必须为我的内联视图添加别名,我需要在原始的select语句中指定它。我的课程遗憾地没有涵盖这个概念。我感谢那些提供有用提示和粗鲁评论的人。所以,谢谢Drew和Matt
答案 1 :(得分:0)
Drew是正确的,你有一个派生表T,但我会尝试添加一些可能对你有用的细节。
如果您希望保持查询相同但使用这些列,则可以将派生表连接回用户表并获取所需的列。比如这个:
SELECT userId, firstname, lastname, gender
FROM
(SELECT COUNT(dvdId) dvdId, u.userId
FROM userDVD
JOIN users u ON userDVD.userId = u.userId
GROUP BY userId) as T
INNER JOIN users u2
ON t.user_id = u2.user_id
WHERE gender = 'F';
当您必须优化大型表上的聚合或查找重复项或类似内容时,返回原始表的技术非常有用。但是在您的情况下,您实际上只需要在结果集中所需的所有列上聚合一个查询,例如:
SELECT
u.userId, u.firstname, u.lastname, u.gender, COUNT(d.dvdId) as DVDCount
FROM
userDVD d
JOIN users u
ON d.userId = u.userId
WHERE u.gender = 'F'
GROUP BY
u.userId, u.firstname, u.lastname, u.gender
;