SQL 脚本,STOCK 返回相同的结果
SQL script, STOCK returning same results
我需要有关 SQL 脚本的帮助。我需要在 dataGrid 上显示一些产品的库存数量,所以有 2 个表,一个是产品,另一个是我保存所有动态的库存。这是我的脚本:
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
这里的问题是所有结果都显示相同 STO_QUANTITY。每个产品都应该显示它自己的库存
您在两个不同的 table 引用上使用了相同的别名,我认为您真的不需要内部引用。
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
我想你可以这样简化。
PRO_LABEL
和 PRO_ID
有什么关系? PRO_ID
每个 PRODUCT
table 是唯一的还是可以重复?
坦率地说,您的内部查询最好一次性 运行,而不是对每个 ID 重复 运行 千次。并非总是如此,但通常它会随着 table 随着数据的增长而扩展得更好。阅读真实数据 "query plans" 和真实 "database schemas"(包括 "indexes")将最终决定。但是,如果您还没有猜测,那么最好开始使用单个数据流进行连接,而不是进行多次单行重新查询。
所以从类似
的东西开始
SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK
GROUP BY PRO_ID
一个查询立即获得所有总和。
然后你可以把它包装成 derived table
并用它来加入 product
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 编写,更冗长和明确。这是否使 read/compose 更容易或更难是个人喜好问题。在这个简单的例子中,实际上没有区别,只是风格不同。
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
在 PRODUCTS
中的唯一性):
SELECT MIN(PRO_LABEL) as PRO_LABEL, STO.PRO_ID, SUM(STO_QUANTITY) AS STO_QUANTITY
FROM PRODUCT PRO, STOCK STO
WHERE STO.PRO_ID = PRO.PRO_ID
GROUP BY STO.PRO_ID
P.S。为简单起见,我在 SQL-89 样式中使用 inner join
。您是否有一些您需要在查询中列出但在 STOCK
中遗漏的产品,您必须将其转换为 outer join
,向左或向右,就像您在问题中所做的那样。
我需要有关 SQL 脚本的帮助。我需要在 dataGrid 上显示一些产品的库存数量,所以有 2 个表,一个是产品,另一个是我保存所有动态的库存。这是我的脚本:
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
这里的问题是所有结果都显示相同 STO_QUANTITY。每个产品都应该显示它自己的库存
您在两个不同的 table 引用上使用了相同的别名,我认为您真的不需要内部引用。
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
我想你可以这样简化。
PRO_LABEL
和 PRO_ID
有什么关系? PRO_ID
每个 PRODUCT
table 是唯一的还是可以重复?
坦率地说,您的内部查询最好一次性 运行,而不是对每个 ID 重复 运行 千次。并非总是如此,但通常它会随着 table 随着数据的增长而扩展得更好。阅读真实数据 "query plans" 和真实 "database schemas"(包括 "indexes")将最终决定。但是,如果您还没有猜测,那么最好开始使用单个数据流进行连接,而不是进行多次单行重新查询。
所以从类似
的东西开始SELECT SUM(STO_QUANTITY) AS STO_QUANTITY, PRO_ID
FROM STOCK
GROUP BY PRO_ID
一个查询立即获得所有总和。
然后你可以把它包装成 derived table
并用它来加入 product
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 编写,更冗长和明确。这是否使 read/compose 更容易或更难是个人喜好问题。在这个简单的例子中,实际上没有区别,只是风格不同。
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
在 PRODUCTS
中的唯一性):
SELECT MIN(PRO_LABEL) as PRO_LABEL, STO.PRO_ID, SUM(STO_QUANTITY) AS STO_QUANTITY
FROM PRODUCT PRO, STOCK STO
WHERE STO.PRO_ID = PRO.PRO_ID
GROUP BY STO.PRO_ID
P.S。为简单起见,我在 SQL-89 样式中使用 inner join
。您是否有一些您需要在查询中列出但在 STOCK
中遗漏的产品,您必须将其转换为 outer join
,向左或向右,就像您在问题中所做的那样。