2012-04-24 16 views
0

私はn to nの関係を持っているので、多くの企業で働くことができる従業員がいるので、どの従業員が1列でSQL?n対nの関係1行で結果を得る方法

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 

私はこれが、can't

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

'employeeid = 1'の出力はどれくらいですか? – Lamak

+0

RDBMSとは? RDBMS –

+0

@ジャスティンによると、それはtsql ... –

答えて

2

最も簡単な方法は、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

かなり良い、タイ –

0

It sounds like you want something that is similar to mySQL's Group_Concat in SQL Serverと思いましたか?

各企業IDが別々の列になるようにこれを行う方法をお探しの場合は、動的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 
関連する問題