Sql 从select语句中删除函数调用

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

我有一个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 

您可以对
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