基于交叉生产的SQL查询优化?
我有以下模式基于交叉生产的SQL查询优化?,sql,db2,Sql,Db2,我有以下模式 客户(CID整数不为空,名称为VARCHAR(30),地址为VARCHAR(50)) 产品(PID整数不为空,名称为VARCHAR(50),价格小数(10,2)) 销售(SID BIGINT不为空,状态VARCHAR(10),CID整数,总价十进制(30,2)) PRODUCTSALE(SID BIGINT不为空,PID整数不为空,单位整数,小计小数(30,2)) 我现在有这样一个声明: SELECT P.NAME, COUNT(DISTINCT C.CID) AS
- 客户(CID整数不为空,名称为VARCHAR(30),地址为VARCHAR(50))
- 产品(PID整数不为空,名称为VARCHAR(50),价格小数(10,2))
- 销售(SID BIGINT不为空,状态VARCHAR(10),CID整数,总价十进制(30,2))
- PRODUCTSALE(SID BIGINT不为空,PID整数不为空,单位整数,小计小数(30,2))
SELECT
P.NAME, COUNT(DISTINCT C.CID) AS NUM_CUSTOMERS
FROM
CUSTOMER AS C, PRODUCT AS P, PRODUCTSALE AS PS, SALE AS S
WHERE
C.CID = S.CID
AND S.SID = PS.SID
AND PS.PID = P.PID
GROUP BY
P.NAME
ORDER BY
NUM_CUSTOMERS DESC
我认为这是在创建一个四表(p,s,PS,C)的交叉积?我可以在其中四个上使用nature join来优化它吗?优化此语句的其他方法是什么?从最大的表开始并向下筛选
SELECT p.NAME, COUNT(DISTINCT c.CID) AS NUM_CUSTOMERS
FROM ProductSale ps
INNER JOIN Product p ON ps.PID=p.PID
INNER JOIN Sale s ON ps.SID=s.SID
INNER JOIN Customer c ON s.CID=c.CID
GROUP BY p.Name
ORDER BY NUM_CUSTOMERS DESC
-在ANSI-92 SQL标准(超过25年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。主键和外键不会有任何影响。您使用的是什么版本和平台的Db2?另外,您真的希望允许例如PRODUCT.NAME、,状态,CUSTOMER.NAME。最好使列不为NULL,除非您真的想让小数中的NULL相当大。您真的需要28位十进制有效数字(30,2)。。像十进制(17,2)这样的东西可能比sufficient@PaulVernon我认为内部联接比交叉积性能更好?我是新来的,这就是我想在这里向专家验证的。在本例中,Db2将把查询重新写入相同的内部表单。另外,原来的帖子并不是一个真正的交叉产品,只是连接在哪里是好的,只是旧的风格SQL@PaulVernon根据w3resource.com/sql/joins/cross-join.php,从foods,company中选择foods.item_name,foods.item_unit,company.company_name,company.company_city;结果为笛卡尔积。我认为我的问题是一样的?你问题中的C.CID=S.CID和S.SID=PS.SID和PS.PID=P.PID阻止了它成为所有意图和目的的交叉产物