2016-12-14 118 views
-1

有人可以帮助优化笛卡尔乘积,因为它需要大量的时间来执行:SQL:避免笛卡尔乘积的usauge

select c_msg.gft_id, 
     a_msg.pkSize 
from Gifts c_msg, 
     (select giftContId, 
       count(*) pkSize 
     from  Gifts gft 
     GROUP BY gft.giftContId) a_msg 
where sentDate between (sysdate-10) and (sysdate-1) 
and a_msg.giftContId = c_msg.giftContId 
order by a_msg.giftId; 
+1

显而易见的解决方案是使用'ON'子句添加连接条件。话虽如此,有什么办法可以加入这两张表? –

+1

这没有多大意义。 Gifts.giftId不是唯一的吗?你打算使用另一张桌子吗?和pkgSize,它代表什么? –

+2

请编辑你的问题,并添加表结构的信息什么是唯一标识符。 – Kacper

回答

3

我不知道这个工程上的Oracle。在postgresql中,你可以这样做:

SELECT gft_id, count(*) over (partition by giftContId) as pkSize 
FROM Gifts 
WHERE sentDate between (sysdate-10) and (sysdate-1) 
ORDER BY giftId; 
+1

是的,它是Oracle的正确语法,它看起来像查询做OP所需要的。 – Kacper