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 已经给出了您需要的实际命令(除了第一行的尾随逗号)。
我正在尝试编写一个查询,该查询将列出我的顾问 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 已经给出了您需要的实际命令(除了第一行的尾随逗号)。