SQL逗号分隔列循环

时间:2016-11-12 15:49:44

标签: sql sql-server tsql

我有一个严重的SQL问题,已经花了我3个小时。我有两张这样的桌子:

第一张表:员工

ID | NAME
---+--------
 1 | John
 2 | Mike
 3 | Robert

第二个表:客户

 ID | NAME    | EMPLOYEES 
 ---+---------+--------------
  1 | Michael | 2,3
  2 | Julia   | 1
  3 | Mila    | 1,2,3

我希望输出如下:

Michael | Mike, Robert
Julia   | John
Mila    | John, Mike, Robert

SQL命令应该获得预期的输出?

2 个答案:

答案 0 :(得分:4)

这是一个糟糕的数据结构,你应该修复它。这是主要的事情。将数字存储为字符串很糟糕。在列中存储多个值很糟糕。不宣布外键关系是不好的。

那就是说,如果其他人设置了这样一个数据库并以这种糟糕的方式这样做,你能做什么?好吧,你可以这样做:

select c.*, e.name
from customers c join
     employees e
     on ',' + cast(e.id as varchar(255)) + ',' like '%,' + c.employee_id + ',%';

请注意,无法使用常规SQL方法(例如索引)优化此查询,因为JOIN条件过于复杂。

这将为您提供比您要求的更多行:

Michael    Mike
Michael    Robert
Julia      John
Mila       John
Mila       Mike
Mila       Robert

但是,这是SQL正常工作的方式,所以你应该习惯它。

答案 1 :(得分:4)

Select A.Name
      ,Employees  = (Select Stuff((Select Distinct ',' +Name From Employees Where charindex(','+cast(ID as varchar(25))+',',','+A.EMPLOYEE_ID+',')>0 For XML Path ('')),1,1,'') )
 From Customers A

返回

Name    Employees
Michael Mike,Robert
Julia   John
Mila    John,Mike,Robert