Sql 从select语句中删除函数调用
我有一个oracle查询,该查询没有从数据库中获取任何产品记录&结果有一个标志,显示某个产品是否在过去12个月内订购。这是通过检查订单表,查看过去12个月内是否有订单而得出的 我有一个不同的查询,为了简单起见,我在这里展示了它的一部分Sql 从select语句中删除函数调用,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个oracle查询,该查询没有从数据库中获取任何产品记录&结果有一个标志,显示某个产品是否在过去12个月内订购。这是通过检查订单表,查看过去12个月内是否有订单而得出的 我有一个不同的查询,为了简单起见,我在这里展示了它的一部分 Product Table - tblProducts Product_Id Name Description Size Default_QTY...... Orders Table - tblOrders Order Id Product
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
您可以对
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
在
tblOrders
的productid,date\u purchased
上添加索引相关子查询值得检查:
-- 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\u Purch)
上建立索引会很好。结果:
PRODUCTID NAME DESCRIPTION FLAG
---------- ---- ----------- ----------
1 P1 D1 1
2 P2 D2 0
3 P3 D3 0