从多个表中选择行,对性能影响最小

时间:2015-07-30 09:19:03

标签: sql oracle select union

我有两个相同列的表。例如,workInfo是一个表,oldworkinfo是另一个表。列可以是 - id,branch,product,Data。 (id是唯一的主键。)当事务完成时,它将从workinfo中删除并移至oldworkinfo。

我想首先编写一个查询来从workinfo进行最佳搜索,然后是oldworkinfo,因为我必须在其他表中执行一些连接操作。

即首先在workinfo表中搜索,如果记录可用则返回,否则在oldworkinfo中搜索并返回记录。以下是我使用union编写的示例查询,但这会在两个表中进行搜索。

with squery as 
(select * from workinfo 
UNION ALL
select * from oldworkinfo)
Select * from squery where squery.id=Key; 

请在单个查询中建议这是可能的。我不能使用plsql选项作为整体连接和其他查询变得复杂。

2 个答案:

答案 0 :(得分:0)

with sub as
(select * from workinfo wi where wi.id = mykey)
select * from sub
union all
select * from oldworkinfo owi where owi.id = mykey and not exists (select * from sub)

编辑:搜索两个表中的行需要union all。通过在not exists上向查询添加oldworkinfo子句,确保仅在workinfo中没有数据时才选择其数据。

然后,工作查询将为select * from workinfo where id=mykey union all select * from oldworkinfo where id=mykey and not exists (select * from workinfo where id=mykey)

出于性能和可读性的原因,我使用了with子句,因此workinfo上的查询只执行一次。

答案 1 :(得分:0)

据我了解,主要的想法是避免对包含历史数据的大桌子进行不必要的扫描。此查询可以帮助避免它:

select * from workinfo where id = Key
UNION ALL
select * from oldworkinfo where 
not exists (
    select null
    from workinfo wi where wi.id = Key
)
and id = Key