需要编写涉及具有相关外键依赖性的多个联接的复杂查询

时间:2016-10-22 03:54:56

标签: sql join ssms-2014

主要问题

我需要一个SQL语句来回答整个问题,而不是使用任何Union语句。在AdventureWorks2014数据库中,我需要找到哪个商店与David Campbell相关联?并按商店名称排序。

  • 此查询必须显示商店名称,以及作为选择中第一项的第一个/最后一个。需要使用各种表之间的连接及其fk依赖关系来完成此查询。

  • 不得包含没有外键关系的联接表。

我尝试过的事情

我运行此查询以获取与商店相关的架构ID和对象ID:

Select 
    object_name(t.object_id), Schema_name(t.schema_id), t.name, c.name
From 
    sys.tables t
Join 
    sys.columns c on t.object_id = c.object_id
Where 
    t.name like '%Store%'
    or c.name like'%Store%'

这让我能够确定我可以加入的特定兴趣表。表格Sales.Customer,其中FK名称为StoreID& PersonID以及列Sales.Store的表StoreName

从那里我查看了fk的依赖关系,并找到了表Person.Person中的名字/姓氏。我没试过这个问题:

Select 
    s.name StoreName, p.FirstName, p.LastName
From 
    sales.customer c
Join 
    person.person p On c.personID = p.businessentityID
Join 
    sales.store s on s.businessentityID = p.businessEntityID
Where 
    p.FirstName Like ‘%David%’ 
    and p.LastName Like ‘%Campbell%’ 
Order by 
    s.Name

问题

不幸的是,我似乎无法隔离哪些商店与David Campbell相关联。我知道联接是不对的,但不确定如何链接" On "正确地使用子句和表来根据其fk依赖性生成正确的结果。

我知道来自person.person的两条记录是通过运行此相关来的:

Select * 
From Person.Person
Where p.FirstName Like '%David%' 
  and p.LastName Like '%Campbell%'

这将返回与{34}和#34; David Campbell"相关联的BusinessentityID 283和609。在表Person.Person中,虽然不知道如何将这些ID链接到与david相关联的商店名称。

基本上我并不清楚具体说明哪些联接导致我的查询没有给出结果。我可以提供更多关于我在需要时尝试过的信息。

寻找提示和反馈。

谢谢!

修改

看来我原来的做法是关闭的。我从Sales.Store中的外键开始,然后从那里开始了另一条路线。我还添加了一个Windows功能来计算与" David Campbell"相关的商店。并在where子句中添加了一个null参数,以便考虑没有名称的商店。

这是我的最终结果:

select
     s.Name StoreName, p.FirstName, p.LastName,
     count(s.BusinessEntityID) Over(Partition by s.salespersonId) as TotalStoresAssociatedWithDavidCampbell         --<38 records show      a "David Campbell"
from 
    Sales.Store s
join 
    Sales.SalesPerson sp on s.SalesPersonID = sp.BusinessEntityID
Join 
    Person.BusinessEntity be on sp.BusinessEntityID = be.BusinessEntityID
Join 
    Person.Person p on p.BusinessEntityID = be.BusinessEntityID
where 
    p.FirstName like '%David%' 
    and p.LastName Like '%Campbell%' 
    or s.Name is null
order by s.Name  

虽然,我不知道这是否是原始问题的正确答案。我认为是,但如果我确定,我会感觉更好。

2 个答案:

答案 0 :(得分:1)

我觉得有些东西与这部分的目的不相符:

Join sales.store s On s.businessentityID = p.businessEntityID

在这部分中,商店与顾客有关系。它与人没有直接关系。

  

商店详细信息 - &gt;商店的顾客 - &gt;人事细节

因此,我猜您应该将商店连接到客户而不是存储到人。

我还没有尝试过此查询,因为我没有连接到数据库。这只是一个想法。

select S.Name StoreName, P.FirstName, P.LastName
from sales.customer C
join person.person P on P.BusinessEntityID = C.PersonID
join sales.store S on S.StoreID= C.StoreID
where P.FirstName = 'David' and P.LastName = 'Campbell'
order by S.Name

答案 1 :(得分:0)

我已从此链接分析冒险数据库的架构图

http://i.stack.imgur.com/LMu4W.gif并检查您的queryjoin是否正确。 但问题出在Sales.Store表中没有BusinessEntityID与Person.Person表的BusinessEntityID匹配,这就是为什么你的查询在结果中没有返回任何内容