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;
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;