Question

Je suis en train de trouver le meilleur moyen de trouver tous les enregistrements d'une table parent qui ne sont pas certains enregistrements dans une table enfant. Par exemple, je veux la requête pour retourner tous les enregistrements de la famille où il n'y a pas d'enfants de sexe masculin ou pas d'enfants à tous.

Exemple 1

Ceci est très lent:

SELECT * FROM Familles
OÙ Families.FamilyID PAS (SELECT FamilyID des enfants OU Children.Gender = "m")

Exemple 2

Ceci est plus rapide:

SELECT * FROM Familles
OU PAS EXISTS (SELECT * FROM enfants OU Children.Gender = "m" et Children.FamilyID = Families.FamilyID)

Exemple 3

Ceci est le plus rapide, mais je suis inquiet pour investir dans ce domaine parce que je ne peux trouver aucune documentation à ce sujet. Je ne sais même pas ce qu'il appelle. Faute d'un meilleur terme, nous avons l'appeler une « requête anonyme ».

SELECT * FROM Familles
LEFT JOIN
[SELECT * FROM enfants où le genre = "m"]. AS AliasChildren ON Families.FamilyID = AliasChildren.FamilyID
OÙ AliasChildren.FamilyID IS NULL

Alors ma question est la suivante:

  1. Qu'est-ce que ce qu'on appelle dans l'exemple 3?
  2. Est-ce une caractéristique de l'accès « grand public » qui seront pris en charge à l'avenir?
  3. Où puis-je trouver de la documentation sur (cela pourrait être plus facile une fois que je sais ce qu'il appelle)?

Merci!

Était-ce utile?

La solution

Exemple 3 est appelé une table dérivée, mais vous pouvez simplifier la requête à ceci:

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

Autres conseils

Qu'est-ce que ce qu'on appelle dans l'exemple 3? Il est appelé une "table Derrived"

Est-il un « mainstream » caractéristique de l'accès qui sera pris en charge à l'avenir? Il est une fonction standard de la norme ANSI SQL pour autant que je sais et est très couramment utilisé.

Où puis-je trouver de la documentation sur ce (cela pourrait être plus facile une fois que je sais ce qu'il appelle)? Voici un sur les

Dans tous les cas, la requête posée par Mitch est votre meilleur pari:

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

Je pense que vous pouvez également essayer quelque chose comme ceci:

SELECT * Familles DE OÙ EN Families.FamilyID (   SELECT Children.FamilyID   des enfants   OÙ Children.Gender <> 'm'   GROUP BY Children.FamilyID )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top