【发布时间】:2016-01-07 12:21:59
【问题描述】:
我写了一个 oracle 查询来获取数据,它返回重复数据,所以我使用 distinct 关键字。但是我得到一个错误:- ORA-01791: not a SELECTed 表达式
Oracle 查询:-
Select Distinct pi.first_name || ' ' || pi.last_name initiator
, pi.user_id
, c.country_name
, e.eform_name
, w.date_stamp_utc
, decode (
waRating.attr_value, 4, 'Very Positive',
3, 'Positive',
2, 'Neutral',
1, 'Negative',
0, 'Very Negative', '???'
) rating
, waEnv.attr_value environment
, nvl(ua.agent_name, '???') browser
, nvl(ua.agent_version, '???') version
, waFeedback.attr_value negative_feedback
From request_workflow w
Inner Join request_workflow_attribute waRating
On waRating.request_workflow_id = w.row_id
And waRating.attr_name = 'UserRating'
Inner Join request_workflow_attribute waEnv
On waEnv.request_workflow_id = w.row_id
And waEnv.attr_name = 'Environment'
Inner Join request_workflow_attribute waBrowser
On waBrowser.request_workflow_id = w.row_id
And waBrowser.attr_name = 'UserAgent'
Left Join request_workflow_attribute waFeedback
On waFeedback.request_workflow_id = w.row_id
And waFeedback.attr_name = 'UserFeedback'
Inner Join person_info pi
On w.performer_id = pi.row_id
Inner Join request_common rc
On w.request_id = rc.row_id
Inner Join eform e
On rc.eform_id = e.row_id
Left Join user_agent ua
On waBrowser.attr_value = ua.user_agent_raw
Inner Join country c
On pi.country_code = c.country_code
Where w.date_stamp_utc
Between '1-dec-2014' And '31-dec-2015'
Order By waRating.attr_value desc, eform_name;
请建议如何使它工作。
【问题讨论】:
-
首先,这是无效的 -
w.date_stamp_utc between '1-dec-2014' and '31-dec-2015'如果你想比较日期,你必须使用to_date... -
是的,但这不是问题。
-
@Tatiana 在这些情况下,Oracle 将使用
NLS_DATE_FORMAT的值作为格式掩码对非日期文字执行隐式TO_DATE。如果非日期文字与此格式匹配,那么它将起作用 - 但是,如果NLS_DATE_FORMAT被更改,那么它将立即中断(任何调试都是一个巨大的痛苦,因为正在工作的代码不会但没有人将更改代码)。正如您所说,最好使用带有正确格式掩码的TO_DATE或使用 ANSI 日期文字(即DATE '2014-12-01')。 -
w.date_stamp_utc between DATE '2014-12-01' and DATE '2015-12-31'将获取包括2014-12-01 00:00:00到2015-12-31 00:00:00在内的所有日期和时间,但不超过2015-12-31 23:59:59。如果该列包含时间组件并且您打算获取 2015 年的所有值,那么您将错过最后一天的几乎所有这些值。要解决这个问题,您可以使用TRUNC(w.date_stamp_utc)。