Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL需要最有效的方法来选择带有子列表的项目列表吗?_Sql - Fatal编程技术网

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

SQL需要最有效的方法来选择带有子列表的项目列表吗?,sql,Sql,让我们看一个非常简单的示例,有3个表: dbo.个人(人名、姓名、姓氏) 宠物(幼犬、名称、品种) dbo.PersonPet(PersonPetId,PersonId,PetId) 需要选择所有有宠物的人,如果有。。。。例如,在最终应用中,其外观应类似于: 最有效的方法是什么: 选择所有人员,然后在数据访问层中使用单独的Select 在sql级别使用join,然后在数据访问层中过滤所有重复的人员,只将一个添加到结果列表中,而从另一个仅填充宠物列表 还有其他想法吗 最有效的方法是一次将它们全

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

  • dbo.个人(人名、姓名、姓氏)
  • 宠物(幼犬、名称、品种)
  • dbo.PersonPet(PersonPetId,PersonId,PetId)
需要选择所有有宠物的人,如果有。。。。例如,在最终应用中,其外观应类似于:

最有效的方法是什么:

  • 选择所有人员,然后在数据访问层中使用单独的Select
  • 在sql级别使用join,然后在数据访问层中过滤所有重复的人员,只将一个添加到结果列表中,而从另一个仅填充宠物列表
  • 还有其他想法吗

  • 最有效的方法是一次将它们全部选中:

    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
    
    需要选择所有有宠物的人,如果他们有

    使用:


    就个人而言,我会将其作为sql server上的存储过程来执行。无论采用哪种方式,出于显示目的,您都必须过滤掉重复的姓名和姓氏。

    检索记录所需的大部分时间都花在设置和删除对数据库的查询上。在查询中使用多少数据或多少表没有多大区别。使用单个查询来获取所有数据将更加高效。如果您的数据访问层分别获取每一个数据,那么您的速度会很慢。一定要使用连接

    如果您的客户端和后端支持多个结果集,您也可以执行类似的操作(假设其MSSQL)

    数据检索时间大致相等,因为它只需一次访问数据库。一些客户机支持结果之间的关系,允许您执行以下操作 Person.GetPets()或Pet.GetPerson()


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

    这并不完全正确。如果有一个包含数百万行且没有索引的表呢?设置/拆卸时间会比检索时间快吗?
       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
    
    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