从选择语句中删除函数调用

时间:2018-12-19 09:56:35

标签: sql oracle oracle11g

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

2 个答案:

答案 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上添加索引