Access 2007 - 左连接返回正确结果,内连接不返回任何结果

Posted

技术标签:

【中文标题】Access 2007 - 左连接返回正确结果,内连接不返回任何结果【英文标题】:Access 2007 - Left Join returns correct results, Inner Join returns nothing 【发布时间】:2013-01-23 04:59:48 【问题描述】:

我有一个查询,我可以让它工作的唯一方法是在三个字段上左连接。如果我对这三个字段进行普通的内部联接,则查询不会返回任何内容。但是,如果我分别尝试每个人加入,他们都会按照我的预期加入,例如鲍勃到鲍勃,书店到书店,面包到面包等等。

那么对于这两组查询结果...

1.Manager  1.Shop     1.Product  1.Cost     2.Manager  2.Shop     2.Product   2.Quantity
Bob        Hardware   Spanners    15        Bob        Hardware   Spanners     3
Terry      Food       Bread       12        Terry      Food       Bread        4
Sue        Bookshop   Books       18        Sue        Bookshop   Books        7

...此查询不返回任何结果:

SELECT 1.Manager, 1.Shop, 1.Product, 1.Cost, 2.Quantity
FROM 1 INNER JOIN 2 ON 1.Manager = 2.Manager AND 1.Shop = 2.Shop AND 1.Product = 2.Product;

我知道加入文本并不理想,但我有类似的查询可以毫无问题地加入这三个字段,所以想知道这是否是我遇到的 Access 的“功能”,或者它是否可能是数据有问题?

-编辑-

通过将 JOIN 条件放入 WHERE 子句中,我发现,如果我有 WHERE 1.Manager = "Bob" AND 2.Manager = "Bob:

WHERE 1.Product = "Spanners"

独立工作,并且:

WHERE 2.Product = "Spanners"

单独工作,但将两者结合起来:

WHERE 1.Product = "Spanners" AND 2.Product = "Spanners"

再次没有返回任何东西!

-编辑 2-

主查询在引用表中的数据时确实表现正常。因此,基本查询返回结果的方式可能有些奇怪。

-编辑 3-

这是问题示例的链接:[链接已删除]

01 ***查询:这两个是相同的,但一个是指表,并且有效;而另一个是指查询,并且不起作用。我想知道为什么查询版本不起作用。

02 2nd Level Queries and Tables:每组数据有两个版本 - 一个是查询,另一个是使用 Make Table 版本的查询创建的表。据我所知,两者都是相同的。

03 和 04 级查询:这些是构成第二级查询的较低级别查询

表:这些是构建所有其他查询的基础表。

【问题讨论】:

这有点奇怪,不是预期的行为,出于兴趣,您是否尝试将查询连接写入where 部分,对于简单的内部连接,这应该不会导致问题? 上面已经测试并添加了。 只是一个想法:您是否考虑过将 (Manager, Shop, Product) 元组放入自己的表中,并在其他两个表中使用该表中的 ID?或者是否有某些原因数据不适合这种安排? 更多的是我的大脑不适合这种安排。 :) 你需要把这些查询后面的查询的sql贴出来。显然,如果样本数据在表格中,这些问题就不会存在。 【参考方案1】:

好的,所以我下载了您的数据库并查看了。我发现如果你把 NumStores 查询放在你的内部连接中,那么它会返回记录,然后就放弃了。我不想听起来很苛刻,但是您在糟糕的数据库设计道路上已经走得太远了,您没有希望走得更远。将继续给您带来问题的众多问题包括: 表中没有主键(没有任何类型的索引)。 对象(查询和表)的难以理解的命名约定。 数据在许多不同的表中重复(规范化违规)。 主查询中的嵌入子查询。 如果您想使用 Access 来帮助您,您需要学习如何使用它。

【讨论】:

哈,不要犹豫。 :) 我会在星期一重新安排查询,如果能解决问题,我会很高兴。有几件事是因为它是一个精简的示例(例如,主数据库在大多数表中确实有主键,而 USMaster 实际上是基于地址中数据的查询)。我主要用它来将 SQL 查询输入 Excel,从这个意义上说,它不是一个完整的多用户数据库。但是你能告诉我为什么在主查询中嵌入子查询是一件坏事吗? 很难弄清楚发生了什么,因为当您打开查询编辑器时,您会看到一个对象,但无法在数据库容器中找到它。存储的查询也会在运行之前进行编译,因此速度更快。【参考方案2】:

作为记录,如果有人看到这个问题有类似的问题 - 输入主查询的查询之一是对一个字段进行分组,该字段没有出现在该特定查询的任何位置。一旦我从 Group By 子句中删除了该字段,主查询就会返回我预期的结果。

奇怪的是,一个查询实际上返回了完全相同的结果,但行为不同,但就是这样。

【讨论】:

【参考方案3】:

未来(2017 年,Access 2010)在这里也遇到了同样的问题。 出于某种原因,Left Join 会产生与 Inner Join 完全相同的结果,但它却神秘地停止了。 在 "Feb 11 '13 at 9:54" 消息之后,我注意到其中一个已加入的查询将未显示的 Group By 字段增加了一倍(没有理由),因此我删除了它们。有效。 Access 重新创建了未显示的 Group By 字段,但不再加倍,这就是(错误?)问题。

【讨论】:

以上是关于Access 2007 - 左连接返回正确结果,内连接不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2007 OpenForm 方法,无法获取 where 子句以产生正确的结果

ms-access 中的左连接和内连接

当 Access 2007 数据库设置为“使用 Sharepoint 联机工作”模式时,我的应用程序无法正确连接

MS Access:左连接不返回左表中的所有行

Access 2007 组合框显示表中的错误结果

MS Access 2007 中的 SQL 内部连接