为什么左连接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);
您想要的结果不显示来自 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;