2013-03-17 202 views
3

如何選擇公司及其子公司的所有員工?選擇父母和子女記錄

使用SQL Server 2008

員工

Id | Name | CompanyId 

公司

Id | Name | ParentCompanyId 

例子:

1微軟0

2微軟印度1

3微軟西班牙1

我有下面這樣的查詢這給微軟只有員工,而不是來自微軟印度&西班牙。

SELECT Id, Name FROM Employee WHERE CompanyId=1 

我不擅長SQL。幫我解決這個問題。

+1

您可以使用[遞歸CTE](http://msdn.microsoft.com/en-us/library/ms186243(v = sql.105).aspx)。 – 2013-03-17 14:20:39

+1

奇怪的是,您只是點擊了投票下來按鈕而不是嘗試查詢。爲什麼不嘗試它,你會得到結果。但是如果你想提供一個母公司的ID,那麼這個故事就不一樣了。我回應了你在這裏問的問題。 – LiaqatG 2013-03-17 14:26:07

+1

@LiaqatG,我沒有投票。不知道誰投了票。請確認,雖然您的答案可能不準確;)無論如何-2爲其他投票下來和+10爲我的投票= = + 8分爲您。 – Billa 2013-03-17 17:14:41

回答

7

使用CTE打造公司層次,然後加入這一回僱員表:

with CompanyHierarchy as 
(
    select Id 
    from Company 
    where Id = 1 
    union all 
    select c.Id 
    from Company c 
    inner join CompanyHierarchy ch on c.ParentCompanyId = ch.Id 
) 
select e.* 
from CompanyHierarchy ch 
    inner join Employees e on ch.Id = e.CompanyId 

SQL Fiddle with demo

您也可以替換CompanyId可變進CTE的錨定部分,如果你想參數化的語句:

with CompanyHierarchy as 
(
    select Id 
    from Company 
    where Id = @CompanyId 
    union all 
    select c.Id 
    from Company c 
    inner join CompanyHierarchy ch on c.ParentCompanyId = ch.Id 
) 
select e.* 
from CompanyHierarchy ch 
    inner join Employees e on ch.Id = e.CompanyId 

SQL Fiddle with demo,現在添加了層級。

0

而且,這是因爲你只是要求他的公司ID記錄查詢正確的是1

你必須寫你的查詢是這樣的。

SELECT Id, Name FROM Employee WHERE CompanyId in (SELECT Id FROM Company) 

現在我已經嘗試了上面的內容,它會完成您給定的查詢所要做的事情。但對於基於Comapny/ParentCompany的預期結果,請嘗試以下查詢。

SELECT e.Id, e.Names FROM Employee e WHERE e.CompanyId = 1 
    or e.CompanyId in (SELECT c.Id FROM Company c where c.ParentCompanyId = 1) 

希望這會有所幫助。

+0

這是我最初嘗試..但不知道這是正確的方法與性能 – Billa 2013-03-17 17:11:13

+0

對於性能,恐怕你必須檢查它。如果我能找到更好的方法,我也會研究它。當然取決於數據量。如果你沒有處理成千上萬條記錄,那麼我認爲你會沒事的。雖然會再次檢查。謝謝 – LiaqatG 2013-03-17 17:28:26

0
SELECT 
    employee.name, 
    company.id 
FROM employee 
INNER JOIN company 
On employee.companyId= company.id 
WHERE company.id IN (1,2,3)