SQL需要最有效的方法来选择带有子列表的项目列表吗?

时间:2010-01-20 20:55:58

标签: sql

让我们看一些非常简单的例子,有3个表:

  • dbo.Person(PersonId,Name,Surname)
  • dbo.Pet(PetId,Name,Breed)
  • dbo.PersonPet(PersonPetId,PersonId,PetId)

如果有人的话,需要选择所有带宠物的人....在最终的应用程序中,它应该看起来像:

最有效的方式:

  1. 选择所有人,然后在数据访问层中填写每个人的宠物清单并单独选择?
  2. 在sql级别使用join,然后在数据访问层中过滤所有人的副本,只添加一个到结果列表和其他刚填充的宠物列表?
  3. 还有其他想法吗?

5 个答案:

答案 0 :(得分:1)

最有效的方法是一次性选择它们:

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

答案 1 :(得分:0)

  

如果有人的话,需要选择所有带宠物的人......

使用:

   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

答案 2 :(得分:0)

我个人会把它作为sql server上的存储过程。无论你采用哪种方式,出于显示目的,你将不得不过滤掉重复的姓名和姓氏。

答案 3 :(得分:0)

检索记录所花费的大部分时间用于设置和拆除对数据库的查询。在查询中使用了多少数据或多少个表并没有多大区别。使用单个查询获取所有数据会更有效。如果您的数据访问层分别获取每个数据,则速度会很慢。绝对使用连接。

答案 4 :(得分:0)

如果您的客户端和后端支持多个结果集,您也可以做类似的事情(假设其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

数据检索时间与数据库的一次访问大致相同。一些客户支持结果之间的关系,允许您执行类似的操作 Person.GetPets()或Pet.GetPerson()

这种方法的主要优点是,如果你与人合作,你不必担心“过滤所有人复制[s]”