我有一个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),并且Order表非常大(到目前为止有2800万条记录)。由于select语句中的此调用函数会影响性能。还有什么其他方法可以检查订单表中是否存在产品?
Select ProductId, Name, Description, Size, fun_IsPurcInLast12(ProductId) From tblProduct
答案 0 :(得分:1)
相关子查询值得检查:
-- 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
答案 1 :(得分:0)
您可以对LEFT JOIN
个订单进行DISTINCT
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
在productid,date_purchased
上的tblOrders
上添加索引