2012-04-24 75 views
0

所以我有一個員工可以在很多公司工作,所以我有一個n to n關係,我怎樣才能獲得一個員工工作的公司,只有一行的sql?n對n關係如何獲得一行結果

example 
table - employee 
Employeeid employeename 
1    mike 

table company 
companyId CompanyName 
1   cocacola 
2    nokia 
3    intel 

table employeeCompany 
id employeeid companyid 
1  1   1 
2  1   2 
3  1   3 

我想這個,但不容

select Employeeid , companyid 
from employeeCompany 
where employeeid = 1 
group by Employeeid , companyid 
+0

'employeeid = 1'的預期輸出是什麼? – Lamak 2012-04-24 16:59:05

+0

什麼RDBMS?有不同的方式取決於RDBMS – 2012-04-24 17:07:25

+0

@Justin,它說tsql ... – 2012-04-24 17:09:07

回答

2

在Sql Server中最簡單的方法是使用FOR XML PATH。神祕的部分.value('text()[1]','nvarchar(max)')處理特殊的xml字符。

select employee.*, companies.* 
from Employee 
OUTER APPLY 
(
    select stuff ((SELECT ', ' + Company.CompanyName 
     FROM EmployeeCompany 
     INNER JOIN Company 
      ON EmployeeCompany.CompanyId = Company.CompanyID 
     WHERE EmployeeCompany.employeeid = Employee.EmployeeID 
     ORDER BY Company.CompanyName 
     FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)') 
    , 1, 2, '') Companies 
) companies 

請參閱演示Sql Fiddle

+0

相當不錯,ty – 2012-04-24 19:21:45

0

It sounds like you want something that is similar to mySQL's Group_Concat in SQL Server

如果您正在尋找一種方法來讓每個companyid位於一個單獨的列中,那麼只有在使用動態SQL時纔會遇到一些困難。在哪一個時候,將它返回給應用程序並讓它在自己的邏輯中處理它所需要的可能會更容易?

順便說一句,動態SQL邏輯會像這樣,如果你想知道...注意它是多麼討厭...因此,我爲什麼會建議反對它。

select @highestCount = max(count(*)) 
from employeeCompany 
group by Employeeid 

declare createtemptable varchar(max), @filltableselect varchar(max), @filltablejoin varchar(max) 
declare @currentCount int 
set @currentCount = 0 
set @createtemptable = 'CREATE TABLE #Temp (EmployeeID INT' 
set @filltableselect = 'INSERT INTO #Temp SELECT EmployeeCompany0.EmployeeID, EmployeeCompany0.CompanyID' 
set @filltablejoin = 'FROM EmployeeCompany AS EmployeeCompany0' 

while(@currentCount < @highestCount) 
begin 
    set @createtemptable = @createtemptable + ', CompanyID' 
     + CAST(@currentCount AS VARCHAR(2)) + ' INT' 

    if(@currentCount > 0) 
    begin 
     set @filltableselect = @filltableselect + ', EmployeeCompany' 
      + CAST(@currentCount AS VARCHAR(2)) + '.CompanyId' 

     set @filltablejoin = @filltablejoin 
      + 'LEFT JOIN EmployeeCompany AS EmployeeCompany' 
      + CAST(@currentCount AS VARCHAR(2)) 
      + ' ON EmployeeCompany0.EmployeeID = EmployeeCompany' 
      + CAST(@currentCount AS VARCHAR(2)) + '.EmployeeID' 
    end 

    set @currentCount = @currentCount + 1 
end 
set @createtemptable = @createtemptable + ')' 
--This next line can be whatever you need it to be 
set @filltablejoin = @filltablejoin + 'WHERE employeeCompany0.EmployeeID = 1' 

exec @createtemptable 
exec @filltableselect + @filltablejoin