代码之家  ›  专栏  ›  技术社区  ›  FrustratedWithFormsDesigner

Oracle相关子查询问题

  •  2
  • FrustratedWithFormsDesigner  · 技术社区  · 16 年前

    我有这个问题:

    select acc_num
    from (select distinct ac_outer.acc_num, ac_outer.owner
           from ac_tab ac_outer
           where (ac_outer.owner = '1234567')
                 and ac_outer.owner = (select sq.owner
                                          from (select a1.owner
                                                 from ac_tab a1
                                                 where a1.acc_num = ac_outer.acc_num /*This is the line that gives me problems.*/
                                                 order by a1.a_date desc, a1.b_date desc, a1.c_date desc) sq
                                          where rownum = 1)
           order by dbms_random.value()) subq
    order by acc_num;
    

    我们的想法是 acc_num s(不是主键)来自 ac_tab ,有一个 owner 属于 1234567 .

    因为一个 附件编号 在里面 阿克斯表 可能已经改变了 主人 随着时间的推移,我试图使用内部相关子查询来确保 附件编号 只有当它 最近的 主人 12345678 . 当然,它不起作用(或者我不会在这里发布;)

    Oracle给了我一个错误: ORA-000904 ac_outer.acc_num is an invalid identifier .

    我以为 ac_outer 对于相关的子查询应该是可见的,但由于某种原因它不是可见的。是否有修复查询的方法,或者是否必须使用pl/sql来解决这个问题?

    (Oracle版本为10g)

    5 回复  |  直到 16 年前
        1
  •  6
  •   Dan    16 年前

    我不知道为什么彼得使用最小(所有者)分析函数而不是第一个值(所有者)。我相信后者给了你所需要的,而民(业主)给了你“最低”的业主。我同意查询中的所有其他内容:

    Select Distinct acc_num
    From (
          Select
                acc_num,
                owner,
                first_value(owner) Over ( Partition By acc_num
                      Order By a_date Desc, b_date Desc, c_date Desc
                    ) recent_owner
          From ac_tab
         )
    Where owner = '1234567'
          And owner = recent_owner
    Order By acc_num;
    
        2
  •  4
  •   Peter Lang    16 年前

    我不知道你需要什么 dbms_random.value() 但下面的查询使用 analytic functions 应该给你预期的结果:

    Select Distinct acc_num
    From (
      Select
        acc_num,
        owner,
        First_Value(owner) Over ( Partition By acc_num
                                  Order By a_date Desc, b_date Desc, c_date Desc
                                ) recent_owner
      From ac_tab
    )
    Where owner = '1234567'
      And owner = recent_owner
    Order By acc_num;
    

    子查询为您提供所有者和最近的所有者 acc_num ,然后可以在外部查询中进行比较。

        3
  •  2
  •   FrustratedWithFormsDesigner    16 年前

    我认为通过在子查询中嵌套两个深度,您将失去“ac_outer”别名的作用域。我显然不知道您的模式,但将依赖max(日期)来完成任何排序操作和rownum。你为什么不试试这样的东西:

    select ac_outer.acc_num, ac_outer.owner, max(a1.adate), max(a1.b_date), max(a1.c_date)
    from   ac_tab "AC_OUTER"
    where  ac_outer.owner = '1234567'
    group by ac_outer.owner, ac_outer.acc_num;
    
        4
  •  1
  •   user296088    16 年前

    您应该使用Oracle Analytical函数通过使用分区

        5
  •  0
  •   jva    16 年前

    您可以用一个不存在的子查询替换已排序的子查询,以检查以后是否还有其他所有者。

    推荐文章