需要从子查询中选择列到主查询中

时间:2013-06-07 07:14:05

标签: oracle subquery

我有一个像下面这样的查询 - 表名等已更改,以保持实际数据的私密性

SELECT inv.*,TRUNC(sysdate)
FROM Invoice inv
WHERE (inv.carrier,inv.pro,inv.ndate) IN
(
    SELECT carrier,pro,n_dt FROM Order where TRUNC(Order.cr_dt) = TRUNC(sysdate)
)

我正在根据订单从发票中选择记录。即Invoice的所有记录,与今天的订单记录相同,基于这3列......

现在我想在我的选择查询中从Order中选择Order_Num ..这样我就可以使用整个事物将它插入完全独立的表中,让我们说orderedInvoices。

insert into orderedInvoices(seq_no,..same columns as Inv...,Cr_dt)
(
    SELECT **Order.Order_Num**, inv.*,TRUNC(sysdate)
    FROM Invoice inv
    WHERE (inv.carrier,inv.pro,inv.ndate) IN
    (
        SELECT carrier,pro,n_dt FROM Order where TRUNC(Order.cr_dt) = TRUNC(sysdate)
    )
)

?? - 如何在主查询中为该子查询的每个记录选择Order_Num?

P.S。我知道trunc(cr_dt)不会在cr_dt上使用索引(如果索引在那里......)但我无法选择记录,除非我省略了它的时间部分.. :(

1 个答案:

答案 0 :(得分:1)

如果表格ORDER 1 CARRIERPRON_DT上是唯一的,您可以使用JOIN代替IN来限制记录,它还使您能够从任一表中选择您想要的任何数据:

select order.order_num, inv.*, trunc(sysdate)
  from Invoice inv
  join order ord
    on inv.carrier = ord.carrier
   and inv.pro = ord.pro
   and inv.ndate = ord.n_dt
 where trunc(order.cr_dt) = trunc(sysdate)

如果它不是唯一的,那么您必须使用DISTINCT对记录集进行重复数据删除。

虽然在TRUNC()上使用CR_DT不会在该列上使用索引,但如果确实需要索引,则可以使用此功能索引。

create index i_order_trunc_cr_dt on order (trunc(cr_dt));

<子> 1。对于表格而言,这是一个非常糟糕的名称,因为它是关键字,请考虑使用ORDERS