【问题标题】:oracle query return duplicate dataoracle查询返回重复数据
【发布时间】: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:002015-12-31 00:00:00 在内的所有日期和时间,但不超过2015-12-31 23:59:59。如果该列包含时间组件并且您打算获取 2015 年的所有值,那么您将错过最后一天的几乎所有这些值。要解决这个问题,您可以使用TRUNC(w.date_stamp_utc)

标签: sql oracle ado.net


【解决方案1】:

错误消息是由您的 order by 子句中的字段引起的。这是

order by waRating.attr_value desc, eform_name

在你的选择子句中,你有这个:

waEnv.attr_value environment

虽然字段名称相同,但它们来自不同的表。但是,这可能无关紧要,因为您还在 select 子句中使用了别名。在 order by 子句中使用相同的:

order by environment desc, eform_name

【讨论】:

    【解决方案2】:

    使用group by 代替select distinct

    select . . .
    from . . .
    where . . .
    group by 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', '???')
         , waEnv.attr_value
         , nvl(ua.agent_name, '???')
         , nvl(ua.agent_version, '???')
         , waFeedback.attr_value 
    order by waEnv.attr_value, eform_name;
    

    【讨论】:

    • 为什么会有任何不同?
    • @DanBracuk 。 . . select distinct 允许的语义规则与 group by 不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2013-11-04
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多