0

我有两张桌子:

Employers:
emp_id:     emp_name:
1           Smith
2           John
3           Terry
4           Sue

还有一个,

Skills:
emp_id:  skill:
1        10
1        12
1        14
2        5
2        15

我想得到一个返回这个的查询:

emp_id:  skill:
1        10,12,14
2        5,15

到目前为止,我可以使用以下方法将技能值作为字符串获取:

SELECT STUFF((SELECT DISTINCT  ', ' + skill) AS [text()]
FROM employers inner join skills where emp_id=1
FOR XML PATH ('')),1,1,'')

但这无济于事,因为我需要将项目中的值加入其他列,并且我还需要那个 emp_id。

有什么提示吗?

4

2 回答 2

2

您可以使用以下内容将值连接到一行:

select e.emp_id,
  e.emp_name,
  STUFF((SELECT distinct ', ' + cast(s.skill as varchar(10))
         from Skills s
         where e.emp_id = s.emp_id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,2,'') skills
from employers e;

请参阅带有演示的 SQL Fiddle

然后你仍然可以加入到employers桌子上。

或者您可以CROSS APPLY使用FOR XML PATH

select e.emp_id,
  e.emp_name, 
  left(s.skills, len(s.skills)-1) skills
from Employers e
cross apply
(
  select cast(s.skill as varchar(10)) + ', '
  from  Skills s
  where e.emp_id = s.emp_id
  FOR XML PATH('')
) s (skills);

请参阅带有演示的 SQL Fiddle

于 2013-04-11T10:51:22.823 回答
1

试试这个——

DECLARE @Employee TABLE
(
      emp_id INT
    , emp_name NVARCHAR(50) 
)

DECLARE @Skill TABLE
(
      emp_id INT
    , skill_id INT
)

INSERT INTO @Employee (emp_id, emp_name)
VALUES 
    (1, 'Smith'),
    (2, 'John'),
    (3, 'Terry'),
    (4, 'Sue')

INSERT INTO @Skill (emp_id, skill_id)
VALUES 
    (1, 10),
    (1, 12),
    (1, 14),
    (2,  5),
    (2, 15)

SELECT 
      e.emp_id
    , skills = 
        (
            SELECT STUFF((
            SELECT DISTINCT  ', ' + CAST(s.skill_id AS VARCHAR(10))
            FROM @Skill s
            WHERE s.emp_id = e.emp_id
            FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'), 1, 2, '')
        ) 
FROM @Employee e
于 2013-04-11T11:12:24.573 回答