Access 中的 SQL 帮助 – 寻找数据的缺失

Posted

技术标签:

【中文标题】Access 中的 SQL 帮助 – 寻找数据的缺失【英文标题】:SQL Help in Access – Looking for the Absence of Data 【发布时间】:2010-10-19 14:50:53 【问题描述】:

我正在尝试找到最快的方法来查找父表中没有子表中某些记录的所有记录。例如,我希望查询返回没有男孩或根本没有孩子的所有家庭记录。

示例 1

这太慢了:

从家庭中选择 * WHERE Families.FamilyID NOT IN(SELECT FamilyID FROM Children WHERE Children.Gender="m")

示例 2

这样更快:

从家庭中选择 * WHERE NOT EXISTS(SELECT * FROM Children WHERE Children.Gender="m" AND Children.FamilyID = Families.FamilyID)

示例 3

这是最快的,但我担心投资它,因为我找不到任何文档。我什至不知道它叫什么。由于缺少更好的术语,我们一直将其称为“匿名查询”。

从家庭中选择 * LEFT JOIN[SELECT * FROM Children WHERE Gender="m"]. AS AliasChildren ON Family.FamilyID=别名Children.FamilyID AliasChildren.FamilyID 为 NULL 的位置

所以我的问题是这样的:

    在示例 3 中这个东西叫什么? 它是 Access 的“主流”功能吗? 以后会支持吗? 在哪里可以找到关于 它(一旦我知道它叫什么,这可能会更容易)?

谢谢!

【问题讨论】:

#3 的常用术语是“派生表”。 【参考方案1】:

示例 3 称为派生表,但您可以将查询简化为:

SELECT * FROM Families
LEFT JOIN
Children ON Families.FamilyID = Children.FamilyID AND Children.Gender="m"
WHERE Children.FamilyID IS NULL 

【讨论】:

太棒了,米奇。谢谢你。我只是尝试了一下,并在添加括号后让它工作。 SELECT * FROM Family LEFT JOIN Children ON (Families.FamilyID = Children.FamilyID AND Children.Gender="m") WHERE Children.FamilyID 为 NULL 请注意,在访问派生表时必须在 () 中,但在您保存查询时,访问会将它们更改为 []。你在你的例子中 - 这是行不通的。因此,每次编辑 qry 时都必须使用 []。回到 ()。这很烦人,但很实用。 另外,你应该选择这个作为答案——因为它是最好的。 :) @Shane:抱歉;我在 SQL Server 中测试过! @Mitch - 当然不需要道歉。我感谢您努力真正理解问题 - 以至于您能够为问题提供解决方案,而不仅仅是对所提问题的回答。【参考方案2】:

在示例 3 中这个东西叫什么? 它被称为“派生表”

未来会支持 Access 的“主流”功能吗? 据我所知,它是 ANSI SQL 的一个标准特性,并且非常常用。

我在哪里可以找到有关它的文档(一旦我知道它叫什么,这可能会更容易)? 这是关于他们的blog article

无论如何,Mitch 提出的问题是你最好的选择:

SELECT *   
FROM Families   
LEFT JOIN Children  
  ON (Families.FamilyID = Children.FamilyID) AND (Children.Gender="m")  
WHERE (Children.FamilyID IS NULL)

【讨论】:

希望今天为您提供 3000 个 :) 谢谢,John - 提供事物的名称和博客。我使用方括号的疯狂语法有效,但带括号的普通语法也有效。 那个语法有点奇怪。我建议使用带有括号的更标准的语法。方括号可能是 Access 特定的东西。 如果您在 Access 中编写 SQL 并且它不是直通查询,您将使用 Jet SQL 语法。这取决于您在 Access 中使用的 ANSI 模式,92(使用括号)或 89(默认值,使用括号)。 @David - 仅提及“ANSI”一词很有帮助,因为它是查找更多信息的起点。感谢您的评论。【参考方案3】:

我想你也可以试试这样的:

选择 * 来自家庭 WHERE Families.FamilyID IN ( 选择 Children.FamilyID 来自儿童 WHERE Children.Gender'm' GROUP BY Children.FamilyID )

【讨论】:

以上是关于Access 中的 SQL 帮助 – 寻找数据的缺失的主要内容,如果未能解决你的问题,请参考以下文章

用SQL语句创建和删除Access数据库中的表;添加列和删除列

墨者靶场 SQL手工注入漏洞测试(Access数据库)

墨者靶场 SQL手工注入漏洞测试(Access数据库)

访问 2013 慢

MS Access SQL 将行转换为列

Access 2003 SQL:from 子句中的语法错误