请参阅Sqlplus Oracle 11g中的SQL SUBQUERY

时间:2015-02-26 17:51:32

标签: sql oracle11g subquery sqlplus

我正在尝试编写一个查询,列出Consultant_Id,姓名和年龄,这些顾问在我的顾问表中具有等级'D',并且出生于30多年前,其名称以字母'L'。我需要输出升序年龄顺序。到目前为止我有这个,但我认为有多个错误,任何帮助将不胜感激!

4 个答案:

答案 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