繁体   English   中英

在这里使用什么类型的连接?

[英]What type of join to use here?

我有两个表: StorageTransactionsFutureStockUsageMaterials

StorageTransactions表显示了产品进出存储的所有移动,而FutureStockUsageMaterials表显示了未来产品FutureStockUsageMaterials表的可能移动。

我编写了以下查询:

SELECT 
 SUM(StorageTransactions.Quantity) as CurrentStock, 
 COALESCE(FutureStockUsageMaterials.FutureStock, 0) as FutureStock,
 StorageTransactions.products_ProductId 
FROM StorageTransactions 
   LEFT JOIN FutureStockUsageMaterials 
   ON FutureStockUsageMaterials.products_ProductId = StorageTransactions.products_ProductId 
 GROUP BY StorageTransactions.products_ProductId`

例如,如果将来使用产品ID为3的产品,但在旧交易中没有它的记录,我想看到的是这样的一行:

CurrentStock  |  FutureStock  | products_ProductId
0             |  -325.00      | 3

此查询按预期工作,如显示 3 列,第一列是产品的当前库存,第二列是产品的未来库存,第三列是产品本身。 我的问题是,当StorageTransactions表中没有给定产品的条目,但将来应该使用该产品时,此查询不会返回该行,我假设是因为我的加入。

我怎样才能实现所需的行为,即。 获得所有将在未来使用的产品?

如果StorageTransactions可能FutureStockUsageMaterials记录但FutureStockUsageMaterials将始终可用,则将LEFT JOIN更改为RIGHT JOIN

如果两个表都可能有空记录,那么您需要使用FULL OUTER JOIN但不幸的是,mysql 不支持FULL OUTER JOIN 所以我们需要应用解决方法:

SELECT 
 SUM(StorageTransactions.Quantity) as CurrentStock, 
 COALESCE(FutureStockUsageMaterials.FutureStock, 0) as FutureStock,
 StorageTransactions.products_ProductId 
FROM StorageTransactions 
   LEFT JOIN FutureStockUsageMaterials 
   ON FutureStockUsageMaterials.products_ProductId = StorageTransactions.products_ProductId 
 GROUP BY StorageTransactions.products_ProductId`
UNION 
SELECT 
 SUM(StorageTransactions.Quantity) as CurrentStock, 
 COALESCE(FutureStockUsageMaterials.FutureStock, 0) as FutureStock,
 StorageTransactions.products_ProductId 
FROM StorageTransactions 
   RIGHT JOIN FutureStockUsageMaterials 
   ON FutureStockUsageMaterials.products_ProductId = StorageTransactions.products_ProductId 
 GROUP BY StorageTransactions.products_ProductId`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM