我正在尝试编写一个查询,列出Consultant_Id,姓名和年龄,这些顾问在我的顾问表中具有等级'D',并且出生于30多年前,其名称以字母'L'。我需要输出升序年龄顺序。到目前为止我有这个,但我认为有多个错误,任何帮助将不胜感激!
答案 0 :(得分:2)
我似乎不想攻击你,但既然你说你已经试图解决这个问题很长一段时间而且你被卡住了,那么让我们看一下你所遇到的一些问题。那一刻。
SELECT Consultant_Id, Name, DOB,
这一行有一个逗号。
FROM Consultant;
此行末尾有分号,终止语句,因此where子句是一个单独的无效命令。
WHERE DOB = (SELECT MAX(DOB <= 01-jan-85) FROM CONSULTANT)
您似乎使用01-jan-85
作为日期,但即使它是单引号,它也不是日期字符串,您应该明确地将其转换为日期类型;没有引号它会得到一个无效的标识符(试图将'jan'视为列名)。在<=
调用中使用max()
比较器无论如何都是无效的,我不太确定它应该实现什么。最好的情况是,您从子查询中的表中获取最新的DOB,然后使用它来过滤主查询,这样您将只获得与该确切日期匹配的行(或可能是行)。 30多年前它不会给你所有的DOB。
WHERE name( SELECT SUBSTR(Name,1,20) LIKE 'L%' AS ShortName)
name()
不是函数,所以也许您打算将它与=
进行比较;但是与DOB检查一样,这并不是你想要的。您的子查询没有from
子句,并且与主查询不相关,因此会返回多行,这本身就是一个错误。由于这是第二个过滤器,因此您应该使用AND
而不是第二个WHERE
。而substr()
并没有真正添加任何内容,因为无论如何你都在使用like
。
WHERE Grade = 'D'
这几乎没问题,但也应该是AND
而不是`WHERE。
ORDER BY SUBSTR(DOB, 7,9);
这是将DOB隐式转换为字符串,然后在默认情况下将会话转换为其中的字符7到15。根据您之前使用的日期字符串,您的意思是substr(dob, 7, 2)
,这将为您提供该格式的2位数年份;但你应该整个DOB订购,而不仅仅是年份。
@HepC已经给出了你需要的实际命令(除了第一行的尾随逗号)。
答案 1 :(得分:1)
SELECT consultant_id, name, DOB
FROM consultant
WHERE DOB <= ADD_MONTHS(TRUNC(SYSDATE), 12 * -30)
AND name LIKE 'L%'
AND grade = 'D'
ORDER BY DOB;
答案 2 :(得分:1)
我相信这就是你要找的东西。
SELECT consultant_id, name, DOB
FROM consultant
WHERE DOB <= ADD_MONTHS((SYSDATE), -360)
AND grade = 'D'
AND name LIKE 'L%'
ORDER BY DOB;
答案 3 :(得分:-1)
SELECT Consultant_Id, Name AS ShortName, DOB
FROM Consultant
WHERE DOB < dateadd(year, -30, getdate())
AND name LIKE 'L%'
AND Grade = 'D'
ORDER BY DOB