访问 Vb6 查询

Posted

技术标签:

【中文标题】访问 Vb6 查询【英文标题】:Access Vb6 query 【发布时间】:2020-12-17 22:37:33 【问题描述】:

我需要您的帮助,使用 vb6 和 access db 构建 sql 查询。这是场景:2张桌子,给予和拥有 Tb1 字段 ID、名称、金额 Tb2 编号、名称、金额 我需要在两个表中都有每个名称的总金额,以便有总给列和总有列,但我的查询不起作用

Select tb1.id,tb1.name,sum(tb1.amount) as TG, tb2.id,tb2.name,sum(tb2.amount) as TH
from tb1 inner join 
     tb2
     on tb1.id=tb2.id
group by... Etc

如果我有 10 条记录,其中 tb1 上的 id = 1 和 tb 2 上的 3 条记录,则 tb2 上的总金额是错误的(它会为 tb1 上的每条记录重复 tb2 上的总和)

我也尝试过使用 Union 在行中获得正确的结果,但我应该想要获得类似的东西

Id Name Have Give
1 John Doe 200,00 76,00

我希望通过图片更好地解释

Triyng @Parfait 建议,得到的结果和我之前写的查询很相似。

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

考虑通过id 分别连接两个表的聚合:

聚合查询 (另存为存储的访问查询)

SELECT tb1.idF
     , tb1.[name]
     , SUM(tb1.Give) AS TG
FROM tblGive tb1
GROUP BY tb1.idF
       , tb1.[name] 
SELECT tb2.IDB
     , tb2.[name]
     , SUM(tb2.Have) AS TH
FROM tblHave tb2
GROUP BY tb2.IDB
       , tb2.name

最终查询 (运行 Full Join Query 以返回任一表中的所有不同名称)

SELECT NZ(agg1.idF, agg2.idB) AS [id]
     , NZ(agg1.name, agg2.name) AS [name]
     , NZ(agg2.TH, 0) AS [Have]
     , NZ(agg1.TG, 0) AS [Give]
FROM tblGiveAgg agg1
LEFT JOIN tblHaveAgg agg2
   ON agg1.idF = agg2.idB

UNION 

SELECT NZ(agg1.idF, agg2.idB) AS [id]
     , NZ(agg1.name, agg2.name) AS [name]
     , NZ(agg2.TH, 0) AS [Have]
     , NZ(agg1.TG, 0) AS [Give]
FROM tblGiveAgg agg1
RIGHT JOIN tblHaveAgg agg2
   ON agg1.idF = agg2.idB;


用下面的数据来演示

CREATE TABLE tblGive (
   ID AUTOINCREMENT,
   IdF INTEGER,
   [Name] TEXT(10),
   Give INTEGER
);

INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (1, 'JOHN', 37);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (2, 'ANNA', 10);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (3, 'BILL', -37);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (2, 'ANNA', 116);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (1, 'JOHN', 120);


CREATE TABLE tblHave (
   ID AUTOINCREMENT,
   IDB INTEGER,
   [Name] TEXT(10),
   Have INTEGER
);

INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 200);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (2, 'ANNA', 400);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (3, 'BILL', 150);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 25);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 70);

Final Full Join Query 返回以下结果:

【讨论】:

嗨@Parfait,也感谢您的回答。您的 sql 查询给出了结果,但它与我的预期不同,因为它仅聚合两个表中的名称。因此,如果我有我将在下面说明的场景 Tb1 1 John 150 2 Mike 300 1 John 200 Tb2 16 Tony 32 1 John 50 20 Anna 25 它只给 John 和他正确的差额 Give / Have,实际上我应该想要查找 1 John 350 50 2 Mike 300 0 20 Anna 0 25 谢谢 谢谢@Parfait,但我在加入过程中收到语法错误。显然,上面表示的两个查询完美地工作,但最终查询并非如此。我还在做一些测试,看看错误是否是由转录错误引起的 感谢您的新回答,我已经看到了健忘,并且我已经在测试中纠正了它,查询完美无缺,不幸的是我不得不告诉您,即使这个公式也不会产生我的结果通缉。我以与使用普通 INNER JOIN 相同的方式重复名称。 感谢@Parfait,我已经发布了 3 张解释性图片 ;-) 第三个。第一个图像是名为 Give 的表,第二个是 Have 表。如您所见,在每个表中,您都可以找到许多独立的动作。所以,Bill 必须收到钱,但他没有什么要支付的,其他人在两个表中都有记录。结果可能是一列中所有运动的综合,每个 IDF 有一行【参考方案2】:

尝试使用union all,然后进行聚合:

Select id, name, sum(tg) as tg, sum(th) as th
from (select id, name, amount as tg, 0 as th from tb1
      union all 
      select id, name, 0, amount from tbl2
     ) as t
group by id, name;

我不确定是否所有版本的 MS Access 都支持 union all 这样的 from 子句。如果没有,则需要将该部分封装在视图中。

【讨论】:

谢谢 Gordon,不幸的是我尝试了这个查询,但我遇到了一个错误,所以我认为它不受支持。但是我只是在尝试改变一些东西。稍后我会通知你【参考方案3】:

使用这个 DDL

CREATE TABLE tb1 (
   ID AUTOINCREMENT,
   IdF INTEGER,
   [Name] TEXT(10),
   Give INTEGER
);

INSERT INTO tb1 (IdF, [Name], [Give]) VALUES (1, 'JOHN', 37);
INSERT INTO tb1 (IdF, [Name], [Give]) VALUES (2, 'ANNA', 10);
INSERT INTO tb1 (IdF, [Name], [Give]) VALUES (3, 'BILL', -37);
INSERT INTO tb1 (IdF, [Name], [Give]) VALUES (2, 'ANNA', 116);
INSERT INTO tb1 (IdF, [Name], [Give]) VALUES (1, 'JOHN', 120);


CREATE TABLE tb2 (
   ID AUTOINCREMENT,
   IDB INTEGER,
   [Name] TEXT(10),
   Have INTEGER
);

INSERT INTO tb2 (IDB, [Name], [Have]) VALUES (1, 'JOHN', 200);
INSERT INTO tb2 (IDB, [Name], [Have]) VALUES (2, 'ANNA', 400);
INSERT INTO tb2 (IDB, [Name], [Have]) VALUES (3, 'BILL', 150);
INSERT INTO tb2 (IDB, [Name], [Have]) VALUES (1, 'JOHN', 25);
INSERT INTO tb2 (IDB, [Name], [Have]) VALUES (1, 'JOHN', 70);

这个UNION ALL 查询有效

SELECT      Name
            , SUM(Give) AS TotalGive
            , SUM(Have) AS YotalHave
FROM        (
            SELECT  Name, Give, 0 AS Have
            FROM    tb1
        
            UNION ALL 
        
            SELECT  Name, 0 AS Give, Have 
            FROM    tb2
            ) AS t
GROUP BY    Name;

【讨论】:

以上是关于访问 Vb6 查询的主要内容,如果未能解决你的问题,请参考以下文章

VB6 ms访问sql查询distinct count两个表

vb6和msaccess的时间查询

VB6:错误 3078“... Jet 数据库引擎找不到输入表或查询...”的可能原因是啥

VB6 - 如何在一次调用中执行多个SQL查询

VB6.0 操作SQL数据库(查询,修改,删除,添加)功能

ORA-03113 文件通信结束