Sql 内部查询中的order by和rownum
我有两个链接表A和B 1到n 对于A的所有记录,我希望B的记录符合以下条件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.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
);