SQL Server 2005 - Справка по запросам - PullRequest
1 голос
/ 15 июля 2011

Я пытаюсь написать запрос, используя следующие таблицы примеров:

Company

  • CompanyID
  • Имя
  • County

CompanyRelation

  • ParentCompanyID
  • ChildCompanyID

CompanySpecialty

  • CompanyID
  • Specialty

Таблица CompanyRelation используется потому, что каждая компания может иметь много подкомпаний, а каждая подкомпания может иметь многокомпании над ним.

В идеале я хочу найти все компании по определенному округу и / или по определенной специальности.Теперь, обычно, я просто присоединяю Company к CompanySpecialty и фильтрую по этим двум полям, но вот где это становится сложным: у подкомпаний нет назначенных им округов, поэтому, если я фильтрую по округу, всесубкомпании будут исключены.

Если я отфильтрую компании по округу, я хотел бы отобразить все подкомпании, связанные с этой компанией, независимо от того, что у подкомпании нет адреса.

Комучтобы обойти это, я должен принести таблицу CompanyRelation.

Пример данных:

CompanyID---Name---County
1-----------ABC----King
2-----------BCD----Pierce
3-----------DEF----NULL
4-----------EFG----NULL

ParentCompanyID---ChildCompanyID
1-----------------1
1-----------------3
2-----------------2
2-----------------4

CompanyID---Specialty
1-----------Vehicles
2-----------Vehicles
3-----------Vehicles
4-----------Vehicles

Используя эти данные, скажем, я хочу найти все компании в округе Кинг, которые занимаются транспортными средствами.В моих результатах я бы ожидал увидеть Компанию 1 и Компанию 3.

Как мне написать запрос для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Диаграмма будет выглядеть следующим образом (при этом Компания является основной / родительской таблицей, а все остальные зависят от нее):

Специализация компании <- Компания <- Отношения <- <em>Company -> Company Specialty

Преобразование его в SQL будет выглядеть так:

SELECT
   --whatever fields you want, as long as you prefix with the table alias (p., ps., dr., c., cs.)
FROM
      Company Parent P --parent

   Left Join CompanySpecialty PS
   ON P.CompanyID = PS.CompanyID

   Left Join CompanyRelation CR
   ON P.CompanyID = CR.ParentCompanyID

   Left Join Company C
   ON CR.ChildCompanyID = C.ComapnyID

   Left Join Company Specialty CS
   ON C.CompanyID = CS.CompanyID
WHERE
   (PS.Specialty = 'Vehicle' AND P.County = 'King')
   OR
   (CS.Specialty = 'Vehicle' AND C.County = 'King')
0 голосов
/ 15 июля 2011
SELECT
  d.ChildCompanyID,
  c.Name
FROM
  CompanyRelation d
INNER JOIN
  Company m
  ON d.ParentCompanyID = m.CompanyID
INNER JOIN
  CompanySpecialty s
  ON d.ChildCompanyID = s.CompanyID
INNER JOIN
  Company c
  ON d.ChildCompanyID = c.CompanyID
WHERE
  m.County = N'King'
  AND s.Specialty = N'Vehicles'

Вот пример, который работает:

create table #Company (
CompanyID int,
Name nvarchar(20),
County nvarchar(20))
GO

create table #CompanyRelation (
ParentCompanyID int,
ChildCompanyID int)
GO

create table #CompanySpecialty (
CompanyID int,
Specialty nvarchar(20))
GO

insert #Company VALUES (1, 'ABC', 'King');
insert #Company VALUES (2, 'DFG', NULL);
insert #Company VALUES (3, 'HIJ', NULL);
insert #Company VALUES (4, 'KLM', NULL);
GO

insert #CompanyRelation VALUES (1, 1);
insert #CompanyRelation VALUES (1, 3);
insert #CompanyRelation VALUES (2, 2);
insert #CompanyRelation VALUES (2, 4);
GO

insert #CompanySpecialty VALUES (1, 'Vehicles');
insert #CompanySpecialty VALUES (2, 'Vehicles');
insert #CompanySpecialty VALUES (3, 'Vehicles');
insert #CompanySpecialty VALUES (4, 'Vehicles');
GO

SELECT
  d.ChildCompanyID,
  c.Name
FROM
  #CompanyRelation d
INNER JOIN
  #Company m
  ON d.ParentCompanyID = m.CompanyID
INNER JOIN
  #CompanySpecialty s
  ON d.ChildCompanyID = s.CompanyID
INNER JOIN
  #Company c
  ON d.ChildCompanyID = c.CompanyID
WHERE
  m.County = N'King'
  AND s.Specialty = N'Vehicles'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...