主要问题
我需要一条 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
不过,我不知道这是否是原始问题的正确答案。我想是的,但如果我确定的话,我会感觉更好。