2016-11-12 80 views
1

我有一个严重的问题,已经花了我3个小时的SQL。我有两个表像这样:SQL逗号分隔的列循环

第一个表:员工

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

显然,原来的问题是表的设计。首先修复结构。您不应将逗号分隔值存储在列中。然后查询将是一个简单的'INNER JOIN' –

+0

@Prdp我的EMPLOYEE_ID列是nvarchar。编辑帖子。 Thx – Guest

+1

但它应该是'Employees'表'ID'列的同一数据类型,它也应该从'Employees'表引用'ID' –

回答

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 
+0

谢谢,像一个魅力工作。感谢万次。 – Guest

+2

@Guest乐意帮忙 –

+2

@Guest在桌子不断增长的时候,你会很难过。使用这种结构优化查询将是一场噩梦 –

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工作,所以你应该习惯它。

+0

Bro现在我无法更改表结构,但我会在下次更新。非常感谢 – Guest

+0

@Gordon Linoff,为什么我们必须在两张表之间创建外键?参照完整性是主要的。除此之外,我们可以在创建外键时获得任何优势,例如查询性能? – RGS