2010-01-20 3 views
2

permet de regarder à un exemple très simple, ont 3 tables:SQL besoin le moyen le plus efficace pour sélectionner la liste des éléments avec des sous-listes?

  • dbo.Person (personID, nom, prénom)
  • dbo.Pet (PetId, Nom, race)
  • dbo.PersonPet (PersonPetId, PersonId, PetId)

Besoin de sélectionner toutes les personnes avec leurs animaux de compagnie si la personne en a .... par ex. en application finale, il devrait ressembler smth comme:

ce qui est la façon la plus efficace:

  1. Sélectionner toutes les personnes et dans la couche d'accès aux données remplir chaque liste pets personne avec une sélection séparée?
  2. Utilisez joindre au niveau de sql puis dans la couche d'accès aux données filtrer toutes les personnes duplique, en ajoutant un seul à la liste des résultats et de l'autre juste remplir la liste des animaux de compagnie?
  3. d'autres idées?

Répondre

1

La façon la plus efficace est de les sélectionner à la fois:

select p.*, pt.* 
from Person p 
left outer join PersonPet pp on p.PersonId = pp.PersonId 
left outer join Pet pt on pp.PetId = pt.PetId 
0

besoin de sélectionner toutes les personnes avec les animaux de compagnie leur si personne a une ...

Utilisation:

SELECT per.name, 
      per.surname, 
      pt.name 
    FROM dbo.PERSON per 
LEFT JOIN dbo.PERSONPET perpet ON perpet.personid = per.personid 
    JOIN dbo.PETS pt ON pt.petid = perpet.petid 
0

Personnellement, je le ferais comme un pr stocké oc sur le serveur SQL. Quelle que soit la façon dont vous le faites, à des fins d'affichage, vous devrez filtrer le nom et le prénom en double.

0

La plupart du temps nécessaire pour récupérer des enregistrements est passé à configurer et à démonter une requête dans la base de données. Peu importe la quantité de données ou le nombre de tables que vous utilisez dans la requête. Il sera beaucoup plus efficace d'utiliser une seule requête pour obtenir toutes les données. Si votre couche d'accès aux données est récupérée séparément, vous aurez une mauvaise vitesse. Définitivement utiliser une jointure.

+2

Ce n'est pas tout à fait vrai. Que faire si vous avez une table avec des millions de lignes et aucun index? Le temps de mise en place/démontage serait-il plus rapide que le temps de récupération? – Eugene

0

Si votre client et le support arrière résultat multiples ensembles vous pouvez également faire somthing comme (en supposant son MSSQL)

Create Proc usp_GetPeopleAndPets 
AS 
BEGIN 
    SELECT PersonId, Name, Surname 
    FROM 
    dbo.Person p; 

    SELECT 
     pp.PersonID, 
     p.PetId, p.Name, p.Breed 
    FROM 
    dbo.PersonPet pp 
    INNER JOIN dbo.Pet p 
    ON pp.PetId = p.PetId 
    Order BY pp.PersonId 
END 

Le temps de récupération de données serait à peu près équivalent depuis son un voyage à la DB. Certains clients prennent en charge les relations entre les résultats qui vous permettent de faire quelque chose comme Person.GetPets() ou Pet.GetPerson()

Le principal avantage de cette approche est que si vous travaillez avec des personnes, vous n'avez pas besoin de s'inquiéter du "filtrage [de tous les doublons de personne]"

Questions connexes