Необходимо написать сложный запрос, включающий несколько объединений со связанными зависимостями внешнего ключа.

Главный вопрос

Мне нужен оператор 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%'

Это возвращает BusinessentityID283 и 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

Я проанализировал схему схемы базы данных приключений по этой ссылке

и проверил правильность вашего запроса. Но проблема в таблице Sales.Store: ни один BusinessEntityID не сопоставлен с BusinessEntityID таблицы Person.Person, поэтому ваш запрос ничего не дал в результате

Другие вопросы по тегам