Sql 内部查询中的order by和rownum

Sql 内部查询中的order by和rownum,sql,oracle,join,sql-order-by,rownum,Sql,Oracle,Join,Sql Order By,Rownum,我有两个链接表A和B 1到n 对于A的所有记录,我希望B的记录符合以下条件 A.dep=B.dep B中没有与A相同年份的记录 我要B的加工记录,年份是A年之前的最后一年 如果有多条记录,则采用最新更新日期的记录 如果有多条记录,则采用最新创作日期的记录 如果有多条记录,则使用最新Id的记录 我尝试了以下方法 Select ... from A ... left join B same on A.dep=same.dep and A.year=same.year

我有两个链接表A和B 1到n

对于A的所有记录,我希望B的记录符合以下条件

  • A.dep=B.dep
  • B中没有与A相同年份的记录
  • 我要B的加工记录,年份是A年之前的最后一年
  • 如果有多条记录,则采用最新更新日期的记录
  • 如果有多条记录,则采用最新创作日期的记录
  • 如果有多条记录,则使用最新Id的记录
我尝试了以下方法

Select ...
from A
     ...
     left join B same on A.dep=same.dep and A.year=same.year
     left join B last on A.dep=last.dep and A.year>last.year
where ...
      and same.id is null
      and (last.id is null or
           last.id = (select id from B where dep=A.dep and rownum=1 order by year desc, updateDate desc, creationDate desc, id desc))
但我有一个错误:

00907. 00000 -  "missing right parenthesis"
但是所有的括号都可以。 看起来内部select不支持order by


有什么想法吗?

它是子查询中的
orderby

如果您在SQL*Plus(或显示错误位置的工具)中运行它,您将得到

SQL> select *
  2  from dept d
  3  where 1 = 1
  4    and d.deptno = (select e.deptno from emp e where e.ename = 'KING' order by e.sal);
  and d.deptno = (select e.deptno from emp e where e.ename = 'KING' order by e.sal)
                                                                    *
ERROR at line 4:
ORA-00907: missing right parenthesis
因此:


实际上,内部子查询不支持ORDERBY,因为它将给出一个部分结果集,该结果集将由外部查询进一步操作

获得与其他筛选条件对应的结果集后,使用order by根据您的要求对结果进行排序


因此,在您的情况下,首先让查询匹配您的筛选条件,然后根据需求应用order by。但是,如果您确实希望在将内部子查询结果应用于外部/主查询之前先对其排序,请使用联接。首先基于内部子查询创建结果集,并使用别名将其与具有适当连接条件的其他/主查询结果连接。

假设
b.id
是唯一的,您可以执行以下操作:

select a.*, b.*
from a left join
     b
     on b.dep = a.dep and
        b.year <= a.year and
        b.id = (select max(b2.id) keep (dense_rank first order by b2.year desc, b2.updatedate desc, b2.creationdate desc, b2.id desc)
                from b b2
                where b2.dep = b.dep 
               );
选择a.*,b*
从左连接
B
在b.dep=a.dep和

b、 如果您使用别名,您也应该在您的情况下使用,例如
A.dep=same.dep
而不是
A.dep=b.dep
是的,谢谢这是一个打字错误如何修复什么?删除order by,它在这个上下文中是不相关的。在您的查询中是不相关的,但在我的查询中,我使用rownum=1来检索最近的记录使用rownum或RANK分析函数,而不是order by+rownum。
select a.*, b.*
from a left join
     b
     on b.dep = a.dep and
        b.year <= a.year and
        b.id = (select max(b2.id) keep (dense_rank first order by b2.year desc, b2.updatedate desc, b2.creationdate desc, b2.id desc)
                from b b2
                where b2.dep = b.dep 
               );