Необходимо написать сложный запрос, включающий несколько объединений со связанными зависимостями внешнего ключа.
Главный вопрос
Мне нужен оператор SQL, чтобы ответить на весь этот вопрос, не используя какие-либо Union
заявления. в AdventureWorks2014
База данных мне нужно, чтобы найти, какой магазин David Campbell
связаны с? И сортировать по названию магазина.
Этот запрос должен показывать название магазина, а также первый / последний элементы в вашем выборе. Этот запрос должен быть выполнен с использованием соединений между различными таблицами и их зависимостями fk.
Не должен включать соединенные таблицы без связи с внешним ключом.
Вещи, которые я пытался
Я запустил этот запрос, чтобы получить идентификатор схемы и идентификаторы объекта, которые связаны с магазином:
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
, Я знаю, что объединения не правы, но я не уверен, как правильно связать предложения и таблицы "Вкл" для получения правильных результатов на основе их зависимостей fk.
Я знаю, что две записи из person.person связаны с помощью этого:
Select *
From Person.Person
Where p.FirstName Like '%David%'
and p.LastName Like '%Campbell%'
Это возвращает BusinessentityID
283 и 609, которые связаны с "Дэвидом Кэмпбеллом" в таблице Person.Person
Хотя понятия не имею, как связать эти идентификаторы с названиями магазинов, которые связаны с Дэвидом.
По сути, я не знаю, какие именно объединения приводят к тому, что мой запрос не дает результатов. Я могу включить больше информации о том, что я попробовал, если нужно.
Нужны советы и отзывы.
Спасибо!
РЕДАКТИРОВАТЬ:
Похоже, мой оригинальный подход отключен. Я пошел по другому пути, начиная с внешних ключей в Sales.Store и переходя оттуда. Я также добавил функцию windows для подсчета хранилищ, связанных с "Дэвидом Кэмпбеллом", и добавил нулевой параметр в предложение 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
Хотя я не знаю, правильный ли это ответ на оригинальный вопрос. Я думаю, что да, но я бы чувствовал себя лучше, если бы был уверен.
2 ответа
Я чувствую, что что-то не соответствует цели в этой части:
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