0

だから私は多くの会社で働くことができる従業員を持っているので、私はn to n関係を持っています.SQLで1行だけで、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

これで考えたけど無理

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

2 に答える 2

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でデモを参照してください。

于 2012-04-24T18:55:05.257 に答える
0

Group_ConcatSQL Serverの mySQL に似たものが必要なようですね。

各 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
于 2012-04-24T17:15:55.040 に答える