左加入 MySQL 查看

Left Join in MySQL View

我有两个 table,一个跟踪产品的购买(由其 EAN 表示),另一个跟踪产品的销售。但并非所有出售的产品都在购买 table 中,反之亦然。例如:

购买

PurchaseNo EAN
1 0001
2 0002
3 0003
4 0004

促销

SaleNo EAN
1 0002
2 0003
3 0004
4 0005

我还有一个 table,其中包含 EAN 编号的产品规格:

ProductEAN

EAN Name
0001 Product1
0002 Product2
0003 Product3
0004 Product4
0005 Product5

我现在想创建一个视图来告诉我当前的库存(即使库存为负)。我目前的方法是创建一个购买和销售视图,其中“金额”列告诉我我购买或销售了多少产品。

所以对于我的购买来说:

CREATE VIEW `PurchaseAmount` AS
SELECT 
`ProductEAN`.`EAN` AS `EAN`,
COUNT(`Purchase`.`EAN`) AS `Amount`
FROM (`ProductEAN` JOIN `Purchase`)
WHERE `ProductEAN`.`EAN` = `Purchase`.`EAN`
GROUP BY `ProductEAN`.`EAN`

以及我的销售额。

我现在想结合这两个视图来创建我的最终库存视图。问题是,据我所知和测试,我只能在我的视图中进行正常连接,这会导致我的两个“子”视图不包含未购买或出售的 EAN。因此,我的最终库存视图只能显示购买和销售中的 EAN table。

有什么方法可以在 MySQL 视图中进行左连接以仅保留所有 EAN,即使它们未在 table 视图引用中使用也是如此。

您可以先分别计算 COUNT 的购买和销售,然后将 LEFT JOIN 作为最后的操作,以提高查询效率。

SELECT 
    ProductEAN.EAN                          AS EAN,
    COALESCE(Purchases.num_purchases, 0)    AS num_purchases,
    COALESCE(Sales.num_sales, 0)            AS num_sales
FROM 
    ProductEAN
LEFT JOIN 
    (
    SELECT 
        EAN,
        COUNT(EAN) AS num_purchases
    FROM 
        Purchase
    GROUP BY 
        EAN
    ) Purchases
ON 
    ProductEAN.EAN = Purchases.EAN
LEFT JOIN 
    (
    SELECT 
        EAN,
        COUNT(EAN) AS num_sales
    FROM 
        Sale
    GROUP BY 
        EAN
    ) Sales
ON 
    ProductEAN.EAN = Sales.EAN

因此您可以获取此代码并将其存储在视图中。

参考这个fiddle进行测试:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b2d777f367960cf90d6539980c2ad935