SQL-无效标识符,但在哪里?
我是SQL的初学者,我已经尝试了几个小时的训练,这有什么问题:SQL-无效标识符,但在哪里?,sql,oracle,union,Sql,Oracle,Union,我是SQL的初学者,我已经尝试了几个小时的训练,这有什么问题: select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID) from Logs group by action, to_char(date_Created, 'MON DD YYYY') union select distinct to_char(date_Created, 'MON DD YYYY'), action, 0 from Logs
select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID)
from Logs
group by action, to_char(date_Created, 'MON DD YYYY')
union
select distinct to_char(date_Created, 'MON DD YYYY'), action, 0
from Logs
WHERE jours BETWEEN 'AVR. 14 2014' AND 'AVR. 15 2014'
当我尝试时,它返回一个错误:
ORA-00904: "JOURS" : identificateur non valide
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Erreur à la ligne 7, colonne 6
谢谢 那么:
select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID)
from Logs
group by action, to_char(date_Created, 'MON DD YYYY')
union
select distinct to_char(date_Created, 'MON DD YYYY') as jours, action, 0
from Logs
WHERE to_char(date_Created, 'MON DD YYYY') BETWEEN 'AVR 14 2014' AND 'AVR 15 2014'
那么:
select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID)
from Logs
group by action, to_char(date_Created, 'MON DD YYYY')
union
select distinct to_char(date_Created, 'MON DD YYYY') as jours, action, 0
from Logs
WHERE to_char(date_Created, 'MON DD YYYY') BETWEEN 'AVR 14 2014' AND 'AVR 15 2014'
导致您的问题的原因是标准SQL不允许您在WHERE子句中引用列别名。之所以施加此限制,是因为在执行WHERE代码时,列值可能尚未确定。您不能使用“JOURS”标签,因为WHERE代码尚未意识到它。导致问题的原因是标准SQL不允许您在WHERE子句中引用列别名。之所以施加此限制,是因为在执行WHERE代码时,列值可能尚未确定。您不能使用“JOURS”标签,因为WHERE代码尚未意识到它。您的
SELECT
中的问题是WHERE
子句应用于最后一个SELECT
,其中,jours
未定义。您可以通过将查询包装到另一个SELECT
中来修复它,如下所示:
SELECT * FROM (
-- Here is your original query without the WHERE clause
select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID)
from Logs
group by action, to_char(date_Created, 'MON DD YYYY')
union
select distinct to_char(date_Created, 'MON DD YYYY'), action, 0
from Logs
) as inner
-- Here is your WHERE clause
WHERE jours BETWEEN 'AVR. 14 2014' AND 'AVR. 15 2014'
现在,生成
jours
的查询已经包装好,从WHERE
子句中引用该列是合法的。您的SELECT
中的问题是WHERE
子句应用于最后一个SELECT
,其中没有定义jours
。您可以通过将查询包装到另一个SELECT
中来修复它,如下所示:
SELECT * FROM (
-- Here is your original query without the WHERE clause
select to_char(date_Created, 'MON DD YYYY') as jours, action, count(ID)
from Logs
group by action, to_char(date_Created, 'MON DD YYYY')
union
select distinct to_char(date_Created, 'MON DD YYYY'), action, 0
from Logs
) as inner
-- Here is your WHERE clause
WHERE jours BETWEEN 'AVR. 14 2014' AND 'AVR. 15 2014'
现在,生成
jours
的查询已经包装好,从WHERE
子句中引用该列是合法的。这意味着表logs
中没有名为jours
的列。可能您想要的列被称为jour
或其他什么。错误确实指向了第7行第6列。不能在where子句中使用焦耳,因为它不是列,而是计算字段。您必须用整个表达式替换jours
。如果您编辑问题来描述您试图执行的操作,则可能还有其他方法来编写查询。这意味着您在表logs
中没有名为jours
的列。可能您想要的列被称为jour
或其他什么。错误确实指向了第7行第6列。不能在where子句中使用焦耳,因为它不是列,而是计算字段。您必须用整个表达式替换jours
。如果您编辑问题来描述您正在尝试执行的操作,则可能还有其他方法来编写查询。创建日期的格式掩码应为“MON”。DD YYYY'和日期值应为“AVR”。2014年12月14日和2014年12月14日。15 2014'(在AVR.和14/15之间没有额外的空格。创建日期的格式掩码应为“MON.DD YYYY”,日期值应为“AVR.14 2014”和“AVR.15 2014”(在AVR.和14/15之间没有额外的空格)。