SQL VB6 - 在使用 UNION ALL 和 Left Join 时显示 Datagrid 中的所有条目

SQL VB6 - Showing all Entries in Datagrid while using UNION ALL and Left Join

create table TBLGRN (Supplier varchar(100),
                     ProductID INT,
                     QTY Int,
                     VoucherNo long);

Create table TBLINV (CustomerName varchar(100),
                     ProductID Int,
                     Qty int,
                     Invoiceno Long);

insert into tblgrn 
(Supplier,ProductID,Qty,VoucherNo)
Values
('Supplier1','1','5','12345');

insert into tblgrn 
(Supplier,ProductID,Qty,VoucherNo)
Values
('Supplier1','2','3',NULL);

insert into tblinv
(CustomerName,ProductID,QTY,Invoiceno)
values
('Customer1','1','5','12345');

SELECT g.ProductID, g.Qty AS GRNQTY,
i.qty AS InvQty FROM tblgrn g LEFT JOIN tblinv i
on g.voucherno=i.invoiceno WHERE supplier='SUPPLIER1'
AND i.productid=g.productid GROUP BY g.productid, g.qty, i.qty;

好的,现在我已经编辑并简化了我的代码,我也在 SQLFiddle 上尝试过,这里是 link。
http://sqlfiddle.com/#!9/682bac/4

我希望代码显示 TBLGRN table 中的所有数据,同时加入那些在 tblinv table 上具有相应 voucherno 的条目。如果 tblinv table 中没有相应的 voucherno,则 voucherno 应显示为 null。目前它只显示已售出的 productID 1。我想看看已售出和未售出的商品

希望这次解释的好

根据您的示例数据,我认为您的连接键是 VoucherNo 到 InvoiceNo 和 ProductID。请注意,从会计的角度来看,voucher 不同于 invoice,而是 nvm。试试这个,注意我添加了两个字段:

SELECT g.ProductID,
       g.Qty AS GrnQty,
       i.Qty AS InvQty,
       g.VoucherNo,
       i.InvoiceNo
FROM   TblGrn g
LEFT JOIN TblInv i
ON     g.VoucherNo = i.InvoiceNo
  AND  g.ProductID = i.ProductID
WHERE  g.Supplier = 'SUPPLIER1'
GROUP BY g.ProductID,
       g.Qty,
       i.Qty,
       g.VoucherNo,
       i.InvoiceNo;

您需要将productid where 条件放在left join 中。原因是当i.productid = null

时条件永远不会满足
SELECT g.ProductID
       , g.Qty AS GRNQTY
       , i.qty AS InvQty 
FROM tblgrn g 
     LEFT JOIN tblinv i on g.voucherno=i.invoiceno AND i.productid=g.productid
WHERE supplier='SUPPLIER1'
GROUP BY g.productid, g.qty, i.qty;