【问题标题】:SQL query to get combine multiple id in single value with comma separatorsSQL查询以将单个值中的多个ID与逗号分隔符组合起来
【发布时间】:2016-10-27 04:51:36
【问题描述】:

我有 2 个表 Employee and Skills 包含以下字段:

员工Id,Name,Location

技能Id,Skills

员工数据

Id    Name   Location
7     Abc     London
8     Xyz     London
9     Xyz     USA
10    Abc     USA

技能

Id   skills     EmployeeId
12    AAA Xyz     7
13    BBB         7
14    CCC         7
15    AAA         8
16    BBB         8
17    CCC         8
18    AAA         9
19    BBB         9
20    CCC         9
21    AAA         10
22    BBB         10
20    CCC         10

现在我想获得那些Name is Abc,Location is London and Skills is both AAA and BBB only但我想要如下单一输出的员工的技能

Skills
10,11

这是我的查询:

select S.Id from Employee E inner join
Skills S on E.Id=s.EmployeeId
where (E.Name='Abc' and E.Location='London'
and s.skills='AAA') and (E.Name='Abc' and E.Location='London'
and s.skills='BBB')

但是我得到了错误的输出。

【问题讨论】:

标签: sql sql-server join


【解决方案1】:

您可以为此使用STUFF

Select  Stuff
(
    (
        Select  ',' + Convert(Varchar, S.Id)
        From    Employee    E
        Join    Skills      S   On  S.EmployeeId = E.Id
        Where   E.Name = 'Abc'
        And     E.Location = 'London'
        And     S.Skills In ('AAA', 'BBB')
        For Xml Path ('')
    ), 1, 1, ''
) As Skills

编辑:SQL Fiddle 目前似乎不想与我合作,但使用以下数据(来自 OP),它确实得到了正确的结果:

Create Table Skills
(
  Id int,
  skills varchar (3),
  employeeid int
);

Create Table Employee
(
  Id int,
  Name varchar (10),
  location varchar (10)
  );

insert skills values 
(10    ,'AAA',      1),
(11    ,'BBB',      1),
(13    ,'CCC',      1),
(14    ,'DDD',      1);

insert employee values
(    1     ,'Abc' ,    'London'),
(    2     ,'Xyz',     'Uk');


Select  Stuff
(
    (
        Select  ',' + Convert(Varchar, S.Id)
        From    Employee    E
        Join    Skills      S   On  S.EmployeeId = E.Id
        Where   E.Name = 'Abc'
        And     E.Location = 'London'
        And     S.Skills In ('AAA', 'BBB')
        For Xml Path ('')
    ), 1, 1, ''
) As Skills

编辑 #2 新数据;相同的查询:

Create Table Skills
(
  Id int,
  skills varchar (3),
  employeeid int
);

Create Table Employee
(
  Id int,
  Name varchar (10),
  location varchar (10)
  );

insert skills values
(12    ,'AAA',      7   ),
(13    ,'BBB',      7   ),
(14    ,'CCC',      7   ),
(15    ,'AAA',      8   ),
(16    ,'BBB',      8   ),
(17    ,'CCC',      8   ),
(18    ,'AAA',      9   ),
(19    ,'BBB',      9   ),
(20    ,'CCC',      9   ),
(21    ,'AAA',      10  ),
(22    ,'BBB',      10  ),
(20    ,'CCC',      10  );

insert employee values
(7     ,'Abc',     'London'  ),
(8     ,'Xyz',     'London'  ),
(9     ,'Xyz',     'USA'       ),
(10    ,'Abc',     'USA'       );


Select  Stuff
(
    (
        Select  ',' + Convert(Varchar, S.Id)
        From    Employee    E
        Join    Skills      S   On  S.EmployeeId = E.Id
        Where   E.Name = 'Abc'
        And     E.Location = 'London'
        And     S.Skills In ('AAA', 'BBB')
        For Xml Path ('')
    ), 1, 1, ''
) As Skills

这次的结果是12,13——根据你的情况是正确的:

员工7 是唯一拥有London 中的Abc 的员工,而1213AAABBB 技能。

【讨论】:

  • 怎么回事?它在显示什么?我还需要一点继续...
  • 我会发布一个 SQL Fiddle,但它现在不想和我一起工作。但是使用您的示例数据,我得到了您要求的 exact 结果。
  • 我做到了,它仍然是正确的结果。查看我的编辑。
  • 我不知道为什么这个查询给了我意想不到的输出。你认为如果我有这样的位置:New jersey 而不是 london 我正在搜索这个 New jersey 那么这可能是空间的问题我的位置字段?
  • 我不确定 - 请分析你得到的输出。这些 ID 映射到什么?查看您拥有的数据 - 这些 ID 是否有意义?
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多