1

我有一个类似下面的查询 - 更改表名等以保持实际数据的私密性

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)
)

我正在根据订单从发票中选择记录。即来自发票的所有记录,这些记录与今天的订单记录相同,基于这 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?

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

4

1 回答 1

1

如果表ORDER1在 上是唯一的CARRIERPRO并且N_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()onCR_DT不会在该列上使用索引,但如果您确实需要索引,则可以在此使用功能索引。

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

1. 这是一个非常糟糕的表格名称,因为它是一个关键字,请考虑ORDERS改用。

于 2013-06-07T07:44:32.040 回答