从select语句中删除函数调用



我有一个oracle查询,它没有从数据库中带来任何产品记录&结果有一个标志,显示在过去12个月内是否订购了特定产品。这是通过检查订单表来确定在过去12个月内是否有任何订单。

我有一个不同的查询,为了简单起见,我在这里显示它的一部分。

Product Table - tblProducts
Product_Id   Name   Description   Size   Default_QTY......
Orders Table - tblOrders
Order Id    ProductId    QTY    Price   Date_Purch......

现在,获取产品的查询具有一个接受产品Id&返回布尔值,表示产品是否已提前购买。在这里,我将与产品一起加入许多其他表,这些表返回了相当多的记录(接近100000(&订单数量巨大(到目前为止有2800万条记录(。正因为如此,select语句中的调用函数可能会影响性能。有没有其他方法可以检查订单表中是否有产品?

Select ProductId, Name, Description, Size, fun_IsPurcInLast12(ProductId) From tblProduct 

相关的子查询值得检查:

-- test data
with 
tblProducts(ProductId, Name, Description, pSize) as (
select 1, 'P1', 'D1', 7 from dual union all
select 2, 'P2', 'D2', 4 from dual union all
select 3, 'P3', 'D3', 8 from dual ),
tblOrders(OrderId, ProductId, Date_Purch) as (
select 1, 1, date '2017-05-13' from dual union all
select 2, 1, date '2018-11-06' from dual union all
select 3, 2, date '2013-01-30' from dual )
-- end of test data
select ProductId, Name, Description, 
case when exists (select 1 
from tblOrders 
where ProductId = p.ProductId 
and Date_Purch > add_months(sysdate, -12)) 
then 1 
else 0 
end as flag
from tblProducts p

(ProductId, Date_Purch)上的索引会很好。结果:

PRODUCTID NAME DESCRIPTION       FLAG
---------- ---- ----------- ----------
1 P1   D1                   1
2 P2   D2                   0
3 P3   D3                   0

您可以在DISTINCT订单上执行LEFT JOIN

SELECT productid,
name,
description,
size,
CASE
WHEN o.productid IS NOT NULL THEN 'YES'
ELSE 'NO'
END
AS ispurcinlast12
FROM tblproduct p
LEFT JOIN (
SELECT DISTINCT productid
FROM tblorders
WHERE date_purchased >= ADD_MONTHS(SYSDATE,-12)
) o ON p.productid = o.productid

tblOrdersproductid,date_purchased上添加索引

最新更新