我有一个像下面这样的查询 - 表名等已更改,以保持实际数据的私密性
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上使用索引(如果索引在那里......)但我无法选择记录,除非我省略了它的时间部分.. :(
答案 0 :(得分:1)
如果表格ORDER
1 在CARRIER
,PRO
和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()
上使用CR_DT
不会在该列上使用索引,但如果确实需要索引,则可以使用此功能索引。
create index i_order_trunc_cr_dt on order (trunc(cr_dt));
<子> 1。对于表格而言,这是一个非常糟糕的名称,因为它是关键字,请考虑使用ORDERS
。