A(id,name,createtime)
B(id,aid,name,createtime)
b是a的记录表,a保留一条最新的记录,历史的移动到b中,因此一条a在b中有多条历史记录;
需求:当a在b中有记录时,则时间取b中对应记录的最早的创建时间,其他字段取a中的。
如果b中无数据,则取a中的全部数据
现在的解决方案是(由于数据敏感,以下为原数据表结构的对呀模型):
-- 如果b中有记录:
SELECT * FROM (
SELECT A.id,A.name,B.createtime
FROM A
INNER JOIN B ON A.id=B.aid
ORDER BY B.createtime) tt
GROUP BY tt.id
UNION
-- 如果b中无记录http://ask.csdn.net/questions?type=reward#
SELECT A.*
FROM A LEFT JOIN B ON A.id=B.aid
WHERE B.id IS NULL
但是这样数据量过10万级别时候特别慢,A,B表都有主键。
求优化
任何在where子句中使用is null或is not null的语句优化器都不允许使用索引,,推荐方案:用其他相同功能的操作运算代替,如:a is not null改为a>0或a>''等。
如果b中有记录 :select a.id,a.name, select (select b.createtime from B b where a.id=b.aid order by createtime desc )a where rownum=1 from A a 先查询所有的时间排序取第一条记录,作为一个字段。
如果b中无记录 SELECT A.*
FROM A LEFT JOIN B ON A.id=B.aid
WHERE B.id >0 设置数据库默认值就行。。
最后我把union改成union all瞬间加快了。
将表A、B设置别名 ,就是from A的时候 from A a,select的时候用a,不要用A