Oracle SQL:Union和Joins

时间:2014-07-16 16:10:40

标签: sql oracle join

我有一张桌子ACCPLAN(PRIMARY KEY:ACCOUNT_ID)

ACCOUNT_ID                  PLAN_TYPE            OTHER_STUFF

ACC1                        PLAN_TYPE_ONE        ....
ACC2                        PLAN_TYPE_TWO        ....
ACC3                        PLAN_TYPE_ONE        ....
ACC4                        PLAN_TYPE_TWO        ...

我还有一个表ACCTRANSACTION(PRIMARY KEY - >(ACCOUNT_ID,TRANSACTION_ID)

ACCOUNT_ID TRANSACTION_ID  TRANSACTION_AMOUNT TXN_TYPE

ACC1       1               100                TXN_TYPE_1
ACC1       2               300                TXN_TYPE_2
ACC2       1               400                TXN_TYPE_2
ACC3       1               400                TXN_TYPE_3

有5个固定的plan_types和20个固定的txn_types。只有很少的交易类型     每个plan_type都可以。(例如:TXN_TYPE_1和TXN_TYPE_2可能用于     PLAN_TYPE_TWO可以使用PLAN_TYPE_ONE和TXN_TYPE_2以及TXN_TYPE_3

我正在尝试从ACCTRANSACTION和其他中检索交易信息     来自ACCPLAN的详细信息

这可以通过两种方式完成

方法1

检索每个plan_type并执行联合

select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id =  at.account_id
and ap.plan_type = PLAN_TYPE_ONE
and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2);

union

select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id =  at.account_id
and ap.plan_type = PLAN_TYPE_TWO
and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3); 

union

...

APPROACH 2

使用一个查询检索所有plan_types

 select ap.account_id,ap.other_stuff,at.transaction_amount
    from accplan ap, acctransaction at
    where ap.account_id =  at.account_id
    and 
    ((ap.plan_type = PLAN_TYPE_ONE  and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2))

    or

    (ap.plan_type = PLAN_TYPE_TWO and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3));

考虑到两个表都有庞大的数据,哪种方法更好?请建议。

1 个答案:

答案 0 :(得分:2)

使用联接。联合需要对整个结果进行排序,这对您的数据库来说是一项昂贵的操作。

此外。最好一次读取表格并对每条记录进行一些复杂的检查,而不是只读几次以进行较小的检查。

免责声明:我可以想象一些非常奇怪的极端情况,如果数据库查询计划程序确定大条件不够有选择性并且不使用索引而每个较小的条件确实使用它,则第一个查询运行得更快。行数越多,我使用第二个选项就越多。