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ファミリ
LEFTJOIN
[SELECT*FROM子WHEREGender="m"]。AS AliasChildren ON Families.FamilyID = AliasChildren.FamilyID
WHERE AliasChildren.FamilyID IS 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 に答える