簡體   English   中英

SQL 服務器 2005 - 查詢幫助

[英]SQL Server 2005 - Query Help

我正在嘗試使用以下示例表編寫查詢:

公司

  • 公司編號
  • 姓名

公司關系

  • 母公司 ID
  • 子公司 ID

公司專業

  • 公司編號
  • 專業

使用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。

我怎樣才能寫一個查詢來完成這個?

圖表將是這樣的(公司是主/父表,所有其他表都依賴於它):

公司專業 <-- 公司 <-- 關系 <--公司--> 公司專業

將其轉換為 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')
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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM