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

时间:2009-04-15 14:46:25

标签: sql ms-access derived-table

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

示例1

这很慢:

SELECT * FROM Families
在哪里Families.FamilyID NOT IN(选择FamilyID FROM Children WHERE Children.Gender =“m”)

示例2

这更快:

SELECT * FROM Families
什么不存在(选择*来自儿童WHERE Children.Gender =“m”AND Children.FamilyID = Families.FamilyID)

示例3

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

SELECT * FROM Families
LEFT JOIN
[SELECT * FROM Children WHERE Gender =“m”]。 AS AliasChildren ON Families.FamilyID = AliasChildren.FamilyID
在哪里AliasChildren.FamilyID是空的

所以我的问题是:

  1. 在例3中调用的是什么?
  2. 这是Access的“主流”功能吗? 将来会得到支持吗?
  3. 我在哪里可以找到文档 它(一旦我知道它叫什么,这可能会更容易)?
  4. 谢谢!

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

示例3中调用的是什么?
它被称为“Derrived table”

将来是否会支持Access的“主流”功能?
据我所知,这是ANSI SQL的标准功能,并且非常常用。

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

无论如何,米奇提出的查询是你最好的选择:

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

答案 2 :(得分:0)

我想你也可以尝试这样的事情:

SELECT * 来自家庭 在哪里Families.FamilyID IN(   SELECT Children.FamilyID   来自儿童   Children.Gender<>'m'   GROUP BY Children.FamilyID )