2016-11-12 79 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