SQL Sqlplus Oracle 11g 中的 SUBQUERY 请帮忙

SQL SUBQUERY in Sqlplus Oracle 11g Help please

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

    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
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;

我相信这就是您要找的。

SELECT consultant_id, name, DOB
  FROM consultant
 WHERE DOB <= ADD_MONTHS((SYSDATE), -360)
   AND grade = 'D'
   AND name LIKE 'L%'
 ORDER BY DOB;

我不想看起来是在攻击你,但既然你说你已经尝试解决这个问题很长时间了,但你被困住了,让我们来看看你的一些问题目前有。

SELECT Consultant_Id, Name, DOB,

此行有一个尾随逗号。

FROM Consultant;

此行末尾有一个分号,终止语句,因此您的 where 子句是一个单独的无效命令。

WHERE DOB = (SELECT MAX(DOB <= 01-jan-85) FROM CONSULTANT)

您似乎将 01-jan-85 用作日期,但即使它用单引号引起来,它也是一个字符串而不是日期,您应该明确地将其转换为日期类型;如果没有引号,它将获得无效的标识符(试图将 'jan' 视为列名)。在 max() 调用中使用 <= 比较器无论如何都是无效的,我不太确定它应该实现什么。充其量您从子查询中的 table 获取最新的 DOB,然后使用它来过滤主查询,这样您将只获取与该确切日期匹配的行(或可能是行)。它不会给你30多年前的所有DOB。

WHERE name( SELECT SUBSTR(Name,1,20) LIKE 'L%' AS ShortName)

name() 不是一个函数,所以也许您打算将它与 = 进行比较;但与 DOB 检查一样,这并不是您真正想要的。您的子查询没有 from 子句,并且与主查询不相关,因此 return 多行,这本身就是一个错误。由于这是第二个过滤器,您应该使用 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 已经给出了您需要的实际命令(除了第一行的尾随逗号)。