0

主要问题

我需要一条 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带有 column的表StoreName

从那里我查看了 fk 的依赖关系,并在 table 中找到了名字/姓氏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%'

这将返回BusinessentityID与表中的“David Campbell”相关联的 283 和 609 Person.Person,尽管不知道如何将这些 id 链接到与 david 相关联的商店名称。

基本上我不知道具体是哪些连接导致我的查询没有返回任何结果。如果需要,我可以包含有关我尝试过的内容的更多信息。

寻找提示和反馈。

谢谢!

编辑:

看来我原来的方法是关闭的。我走了一条不同的路线,从 Sales.Store 中的外键开始,然后从那里开始。我还添加了一个 windows 函数来计算与“David Campbell”关联的商店,并在 where 子句中添加了一个空参数来说明没有名称的商店。

这是我的最终结果:

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  

不过,我不知道这是否是原始问题的正确答案。我想是的,但如果我确定的话,我会感觉更好。

4

2 回答 2

1

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

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

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

店铺详情 -> 店铺顾客 -> 人员详情

因此,我想您应该将商店与客户联系起来,而不是将商店与人联系起来。

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

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
于 2016-10-22T06:11:36.343 回答
0

我已经从这个链接分析了冒险数据库的架构图

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

于 2016-10-22T06:57:58.443 回答