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