为什么左连接结果在 MS Access 数据库中不匹配

问题描述 投票:0回答:1

为什么左连接SQL查询结果在MS Access数据库中不匹配?

也许我写的SQL代码有问题?

如果有答案,那么我不想使用 MS Access 中的函数,因为我想使用 VB.Net 的 SQL。

桌子

StocksinDetail

没有 Invno 代码产品 条形码 颜色代码 尺寸 颜色名称 数量
1 ITO-00004 测试1000 03-22164010 - - - 50
1 ITO-00001 测试1000 03-22164010 - S - 50
2 ITO-00001 测试1000 03-22164010 BHTF001 XL 普提赫 50
3 ITO-00001 测试1000 03-22164010 BHTF002 M - 50
4 ITO-00004 测试1001 03-22164010 BHTF001 - 普提赫 50
1 ITO-00005 测试1000 03-22164010 - - - 50

桌子

StocksoutDetail

没有 Invno 代码产品 条形码 颜色代码 尺寸 颜色名称 数量
1 ITO-00001 测试1000 03-22164010 - S - 1
2 ITO-00001 测试1000 03-22164010 BHTF001 XL 普提赫 1

桌子

Stocksfinal

代码产品 条形码 颜色代码 尺寸 颜色名称 数量
测试1000 03-22164010 - - - 50
测试1000 03-22164010 - - - 50
测试1000 03-22164010 - S - 50
测试1000 03-22164010 BHTF001 XL 普提赫 50
测试1000 03-22164010 BHTF002 M - 50
测试1001 03-22164010 BHTF001 - 普提赫 50

想要的结果

代码产品 条形码 颜色代码 尺寸 颜色名称 数量
测试1000 03-22164010 - - - 100
测试1000 03-22164010 - S - 50
测试1000 03-22164010 BHTF001 XL 普提赫 50
测试1000 03-22164010 BHTF002 M - 50
测试1001 03-22164010 BHTF001 - 普提赫 50
SELECT  
    t1.CodeProduct, t1.Barcode, t1.Colorcode, t1.Size, 
    t1.ColorName,
    IIf(IsNull(t1.Qty),'0',t1.Qty)-IIf(IsNull(t2.Qty),'0',t2.Qty) AS QTY_STOCK,
    t1.Qty AS QTY_STOCKIN, t2.Qty AS QTY_STOCKOUT
FROM
    StocksinDetail AS t1
LEFT JOIN 
    StocksoutDetail AS t2 ON (t1.Size = t2.Size)
                          AND (t1.Colorcode = t2.Colorcode)
                          AND (t1.Barcode = t2.Barcode)
                          AND (t1.CodeProduct = t2.CodeProduct);
sql ms-access left-join ms-access-2010
1个回答
1
投票

您想要的结果不显示来自 StocksoutDetail 的任何数据。可以单独使用 StocksinDetail 的聚合查询来获得输出(下面的查询 1)。如果您想从 SQL 语句中所示的两个表中提取数据,请构建每个详细表的聚合查询,然后连接这些查询。

考虑:

查询1:SumIN

SELECT CodeProduct, Barcode, Colorcode, Colorname, Size, Sum(Qty) AS SumINQty
FROM StocksinDetail
GROUP BY CodeProduct, Barcode, Colorcode, Colorname, Size;

查询2:SumOUT

SELECT CodeProduct, Barcode, Colorcode, Size, Sum(Qty) AS SumOUTQty
FROM StocksoutDetail
GROUP BY CodeProduct, Barcode, Colorcode, Size;

查询3:

SELECT SumIN.*, SumOUTQty, SumINQty - Nz(SumOUTQty,0) AS StockQty
FROM SumIN LEFT JOIN SumOUT 
ON (SumIN.Size = SumOUT.Size) AND (SumIN.Colorcode = SumOUT.Colorcode) 
AND (SumIN.Barcode = SumOUT.Barcode) AND (SumIN.CodeProduct = SumOUT.CodeProduct);
代码产品 条形码 颜色代码 颜色名称 尺寸 总INQty 总输出数量 库存数量
测试1000 03-22164010 - - - 100 100
测试1000 03-22164010 - - S 50 1 49
测试1000 03-22164010 BHTF001 普提赫 XL 50 1 49
测试1000 03-22164010 BHTF002 - M 50 50
测试1001 03-22164010 BHTF001 普提赫 - 50 50

如果您想使其成为一体化 SQL,请将每个聚合查询(不带分号)的 SQL 复制/粘贴到第三个查询中 - 生成的 FROM 子句将类似于;

FROM (paste query1 here) AS SumIN LEFT JOIN (paste query2 here) AS SumOUT

然后可以删除前2个查询对象。这是如何使用 Access 查询设计器创建复杂的嵌套查询。

如果详细信息位于单个事务表中,并且有一个字段指定事务是 IN 还是 OUT,则将提供一个聚合查询。因此,这 3 个查询的替代方法是构建一个 UNION 查询,将这 2 个表合并到一个数据集中(就像它们一开始就是一个表一样),然后在另一个聚合的查询中使用该查询。

SELECT CodeProduct, Barcode, Colorcode, Size, Colorname, Sum(Qty * IIf(Cat="OUT", -1, 1)) AS StocksFinal FROM
   (SELECT [No], Invno, CodeProduct, Barcode, Colorcode, Size, Colorname, Qty, "IN" AS Cat FROM StocksinDetail
    UNION SELECT [No], Invno, CodeProduct, Barcode, Colorcode, Size, Colorname, Qty, "OUT" FROM StocksoutDetail) AS DetailUNION
GROUP BY CodeProduct, Barcode, Colorcode, Size, Colorname;
© www.soinside.com 2019 - 2024. All rights reserved.