SQL脚本,返回相同结果的股票
我需要SQL脚本的帮助。我需要在dataGrid上显示一些产品的库存量,所以有两个表,一个是产品,另一个是库存,我保存所有的动作。这是我的剧本:SQL脚本,返回相同结果的股票,sql,firebird,Sql,Firebird,我需要SQL脚本的帮助。我需要在dataGrid上显示一些产品的库存量,所以有两个表,一个是产品,另一个是库存,我保存所有的动作。这是我的剧本: SELECT PRO_LABEL, (SELECT SUM(STO_QUANTITY) STO_QUANTITY FROM STOCK STO LEFT JOIN PRODUCT AS PRO ON PRO.PRO_ID = STO.PRO_ID WHERE PRO.PRO_ID = STO.PRO_ID) STO_QUANTITY FROM PR
SELECT PRO_LABEL,
(SELECT SUM(STO_QUANTITY) STO_QUANTITY FROM STOCK STO
LEFT JOIN PRODUCT AS PRO ON PRO.PRO_ID = STO.PRO_ID
WHERE PRO.PRO_ID = STO.PRO_ID) STO_QUANTITY
FROM PRODUCT AS PRO
ORDER BY PRO.PRO_ID DESC
这里的问题是所有的结果都显示了相同的库存量。每个产品都应该显示自己的库存您在两个不同的表引用中使用了相同的别名,我认为您不需要内部引用
SELECT PRO_LABEL,
(SELECT SUM(STO_QUANTITY) STO_QUANTITY FROM STOCK STO
WHERE PRO.PRO_ID = STO.PRO_ID) STO_QUANTITY
FROM PRODUCT AS PRO
ORDER BY PRO.PRO_ID DESC
我认为您可以这样简化。您在两个不同的表引用上使用了相同的别名,我认为您实际上不需要内部引用
SELECT PRO_LABEL,
(SELECT SUM(STO_QUANTITY) STO_QUANTITY FROM STOCK STO
WHERE PRO.PRO_ID = STO.PRO_ID) STO_QUANTITY
FROM PRODUCT AS PRO
ORDER BY PRO.PRO_ID DESC
我想你可以这样简化。专业标签和专业ID之间的关系是什么?每个
产品表中的PRO_ID
是唯一的还是可以重复
坦率地说,最好让您的内部查询同时运行,而不是一次又一次地为每个ID运行上千次。不一定,但通常随着数据的增长,它的扩展性会更好。最终,在真实数据和真实“数据库模式”(包括“索引”)上读取“查询计划”将是决定性的。但如果您还没有猜测,那么最好开始使用单个数据流进行连接,而不是进行许多单行的重新查询
因此,从以下内容开始
SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK
GROUP BY PRO_ID
一个查询,所有的总和都是正确的
然后您可以将其包装为派生表
,并将其用于与产品
s联接
SELECT PRO_LABEL, STO_QUANTITY
FROM PRODUCT PRO,
( SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK STO GROUP BY PRO_ID ) AS STO_G
WHERE STO_G.PRO_ID = PRO.PRO_ID
这个查询也可以使用CTE
s编写,更加详细和明确。这是让阅读/写作更容易还是更难是一个品味的问题。在这个简单的例子中,除了风格,实际上没有什么不同
WITH STO_G AS ( SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID FROM STOCK STO GROUP BY PRO_ID )
SELECT PRO_LABEL, STO_QUANTITY
FROM PRODUCT PRO, STO_G
WHERE STO_G.PRO_ID = PRO.PRO_ID
或者像这样(假设产品中PRO_ID
的唯一性):
另外,为了简单起见,我使用SQL-89样式的内部连接。如果查询中列出了一些您需要的产品,但是库存
中遗漏了这些产品,您必须将其转换为外部联接
,如您在问题中所做的那样。专业标签
和专业ID
之间的关系是什么?每个产品表中的PRO_ID
是唯一的还是可以重复
坦率地说,最好让您的内部查询同时运行,而不是一次又一次地为每个ID运行上千次。不一定,但通常随着数据的增长,它的扩展性会更好。最终,在真实数据和真实“数据库模式”(包括“索引”)上读取“查询计划”将是决定性的。但如果您还没有猜测,那么最好开始使用单个数据流进行连接,而不是进行许多单行的重新查询
因此,从以下内容开始
SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK
GROUP BY PRO_ID
一个查询,所有的总和都是正确的
然后您可以将其包装为派生表
,并将其用于与产品
s联接
SELECT PRO_LABEL, STO_QUANTITY
FROM PRODUCT PRO,
( SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK STO GROUP BY PRO_ID ) AS STO_G
WHERE STO_G.PRO_ID = PRO.PRO_ID
这个查询也可以使用CTE
s编写,更加详细和明确。这是让阅读/写作更容易还是更难是一个品味的问题。在这个简单的例子中,除了风格,实际上没有什么不同
WITH STO_G AS ( SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID FROM STOCK STO GROUP BY PRO_ID )
SELECT PRO_LABEL, STO_QUANTITY
FROM PRODUCT PRO, STO_G
WHERE STO_G.PRO_ID = PRO.PRO_ID
或者像这样(假设产品中PRO_ID
的唯一性):
另外,为了简单起见,我使用SQL-89样式的内部连接。如果查询中列出了一些您需要的产品,但是库存中缺少这些产品,您必须将其转换为外部联接
,如您在问题中所做的那样。为什么不使用联接和分组<代码>相关子查询
通常会按比例缩放为什么不使用联接和分组<代码>相关子查询
通常缩放更差