2

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

示例 1

这是非常缓慢的:

SELECT * FROM Families
WHERE Families.FamilyID NOT IN(SELECT FamilyID FROM Children WHERE Children.Gender="m")

示例 2

这更快:

SELECT * FROM Families
WHERE NOT EXISTS(SELECT * FROM Children 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
WHERE AliasChildren.FamilyID 为 NULL

所以我的问题是:

  1. 在示例 3 中这个东西叫什么?
  2. 是不是将来会支持的Access的“主流”功能?
  3. 我在哪里可以找到它的文档(一旦我知道它叫什么,这可能会更容易)?

谢谢!

4

3 回答 3

6

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

SELECT * FROM Families
LEFT JOIN
Children ON Families.FamilyID = Children.FamilyID AND Children.Gender="m"
WHERE Children.FamilyID IS NULL 
于 2009-04-15T15:00:00.020 回答
4

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

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

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

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

SELECT *   
FROM Families   
LEFT JOIN Children  
  ON (Families.FamilyID = Children.FamilyID) AND (Children.Gender="m")  
WHERE (Children.FamilyID IS NULL)
于 2009-04-15T14:51:28.293 回答
0

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

SELECT * FROM Families WHERE Families.FamilyID IN (SELECT Children.FamilyID FROM Children WHERE Children.Gender<>'m' GROUP BY Children.FamilyID)

于 2009-04-15T14:55:38.597 回答