Access 2013 中的联接查询

Posted

技术标签:

【中文标题】Access 2013 中的联接查询【英文标题】:Join query in Access 2013 【发布时间】:2015-09-09 19:25:36 【问题描述】:

目前只有一个表可以访问大量数据,因为我无法再在 Excel 中轻松使用它了。

我正在查询从该表中提取数据的部分内容。

7列表格 一列GL_GL_NUM 包含一个事务号。 ~ 这些数字中有 75% 是成对的。我正在尝试提取此列中每个唯一交易号的记录(所有列信息)。

我已经从谷歌上收集了一些假设应该可以工作的代码,但我认为我在语法上遗漏了一些东西,或者只是要求访问做它不能做的事情。

见下文:

SELECT SOURCE_FUND, GLType, Contract, Status, Debit, Credit, GL_GL_NUM
FROM Suspense
JOIN (
SELECT TC_TXN_NUM TXN_NUM, COUNT(GL_GL_NUM) GL_NUM
FROM Suspense
GROUP BY TC_TXN_NUM HAVING COUNT(GL_GL_NUM) > 1 )  SUB ON GL_GL_NUM = GL_NUM

嘿,Beth,这是建议的代码吗?它说 FROM 子句中存在语法错误。谢谢。

从 SuspenseGL 中选择 *

加入(

SELECT TC_TXN_NUM, COUNT(GL_GL_NUM) GL_NUM

来自悬念

按 TC_TXN_NUM 分组

有 COUNT(GL_GL_NUM) > 1

【问题讨论】:

第一行是我的列/字段 【参考方案1】:

您想要详细的结果(所有行和列)还是汇总结果,每个 tx 号只有一行?

如果您想要一个聚合结果,例如不同交易数量的计数,那么您需要将一个或多个聚合函数应用于您包含的任何其他列。

如果你跑

SELECT TC_TXN_NUM, COUNT(GL_GL_NUM) GL_NUM
FROM Suspense
GROUP BY TC_TXN_NUM 
HAVING COUNT(GL_GL_NUM) > 1 

您会为每个不同的 txn 获得一行,但是如果您随后将这些结果与原始表连接起来,您将拥有相同的行数,就好像您根本没有将它们与不同的 txns 连接起来一样。

是否有您不希望包含在结果中的列?如果不是,那么您需要使用的唯一查询是

select * from suspense

考虑到您的列名,您可能想要的是:

SELECT SOURCE_FUND, GLType, Contract, Status, sum(Debit) as sum_debit, 
sum(Credit) as sum_credit, count(*) as txCount
    FROM Suspense
    group by
    SOURCE_FUND, GLType, Contract, Status

根据您的 cmets,如果您无法处理汇总结果,则需要全部处理:

Select * from suspense

什么不工作? 75% 的 txns 是否重复都没关系,您需要发送每一行中的每一列。


好吧,让我们说

Select * from suspense

返回 8 行,并且

select GL_GL_NUM from suspense group by GL_GL_NUM

返回 5 行,因为其中 3 行具有重复的 GL_GL_NUM,而其中 2 行没有。

您希望结果集中有多少行?如果您希望返回少于 8 行,则需要对要返回的每一列执行某种聚合函数。

【讨论】:

Hey Beth 是的,我需要详细的交易结果——所以对于每个唯一的“GL_GL_NUM”,我需要整个记录的信息。我需要能够将东西发送出去以进行更多研究。我希望我可以只看总和。 对于您发送的第一段代码,我在第一行收到错误“查询表达式中缺少运算符语法错误”。 不,如果您不能使用按 txn 分组的聚合结果,那么您将使用详细结果,即所有行的所有列。 您是否建议将此作为设置? SELECT * from SuspenseGL JOIN ( SELECT TC_TXN_NUM, COUNT(GL_GL_NUM) GL_NUM FROM Suspense GROUP BY TC_TXN_NUM HAVING COUNT(GL_GL_NUM) > 1 表示 FROM 子句有语法错误,抱歉我完全是新手。我会由于格式在此评论中丢失,因此也将其发布在我的原始问题中。 嘿,我实际上尝试了 agg 结果,我认为这可以解决问题。我想我误解了这是一切的“总和”。相信这正是我所需要的。非常感谢。【参考方案2】:

您可以执行以下操作:

SELECT S.* FROM
SUSPENSE AS S 
INNER JOIN (SELECT DISTINCT GL_GL_NUM, MIN(ID) AS ID FROM SUSPENSE
            GROUP BY GL_GL_NUM) AS S2
ON S.ID = S2.ID
AND S.GL_GL_NUM = S2.GL_GL_NUM

这将为唯一的 gl_gl_num 返回单行。但是,如果其他行有不同的数据,则不会显示。您必须使用SUM(Credit)SUM(Debit)GROUP BY the gl_gl_num 聚合这些数据。

我附上了一个 SQL Fiddle 来演示我的结果并使其更清晰。

http://sqlfiddle.com/#!3/8284f/2

【讨论】:

我认为这个查询将返回所有记录,除了那些 gl_gl_num 为空的记录 它说“ID引起的定义中的循环引用”

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

带有内部联接和子查询的 Microsoft Access 更新语句

Access SQL 中的联接语句

用于 SQL 内部联接的 MS Access 中的括号问题

如何在 Access 中使用来自另一个表的联接从一个表中删除项目?

将 Access SQL 内部联接查询转换为 mySQL 查询的问题

需要帮助在 MS Access 中实施完全外部联接