主要问题
我需要一个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
虽然,我不知道这是否是原始问题的正确答案。我认为是,但如果我确定,我会感觉更好。
答案 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匹配,这就是为什么你的查询在结果中没有返回任何内容