2013-03-04 97 views
3

我在我的網站上使用sql server 2008 r2和php。 我有2張桌子。如何從另一個表中使用匹配的id來獲取名稱?

1適用於員工。

(int)  (nvarchar) (nvarchar) 

id   name  type 
1   john   2 
2   peter  1 
3   leah   2 
4   frank  1 
5   tang   3 

2是工作

(int)  (nvarchar) (nvarchar) 

workid  name  employees 
    1   task1  1,3 
    2   task2  2,3 
    3   task3  1,3,4 
    4   task4   2 

我想要查詢這給我的工作描述,其中type < 3.

意味着我想造成這樣的員工姓名。

workid  name  employee 
    1   task1  john, leah 
    2   task2  peter, leah 
    3   task3  john,leah,frank 

像明智

所以我怎樣才能達到這個結果與SQL查詢?

我無法更改表架構。

我試圖用case語句,但它不工作。

請幫我得到這個工作..

+1

爲什麼不能更改表格模式?那真是太棒了!你將一個整數數組作爲字符串存儲。數據庫不是爲了進行這種搜索而設計的。所以你必須使用許多非常昂貴的操作才能使事情運行起來。您至少應該(!)將該列轉換爲「SET」。 ......。好多了:看看JW的帖子! – 2013-03-04 03:18:44

+0

假設你不能改變你的表格結構,看看我的文章 - 應該處理你的需求。如果你可以改變你的表格結構,看看JW的答案,因爲它更適合於規範化。我只是不想假設你可以改變你的數據庫結構。 – sgeddes 2013-03-04 03:50:38

回答

2

這樣做的內容不能完全回答這個問題,但它會提示你如何能夠正確地規範表,以便theproblem簡化。

這是一個Many-to-Many的關係。

Employees 
- ID (Primary Key) 
- Name 
- Type 

Task 
- ID (Primary Key) 
- Name 

Work 
- EmployeeID (Foreign Key) 
- TaskID (Foreign Key) 

EMPLOYEE表

id   name  type 
1   john   2 
2   peter  1 
3   leah   2 
4   frank  1 
5   tang   3 

任務表

id   name   
    1   task1  
    2   task2  
    3   task3  
    4   task4 

工作臺

TaskID EmployeeID 
1   1 
1   3 
2   2 
2   4 
3   1 
3   2 
3   3 
4   4 

查詢,

SELECT t.ID, t.Name, 
     STUFF(
     (SELECT ',' + b.Name 
     FROM Work a 
       INNER JOIN Employee b 
        ON a.EmployeeID = b.ID 
     WHERE a.TaskID = t.ID 
     FOR XML PATH ('')) 
     , 1, 1, '') AS NamesList 
FROM Task t 
-- WHERE ..... -- add additional conditions... 
GROUP BY t.ID, t.Name 
+0

謝謝JW。我要求客戶端改變模式並規格化表格。 – Mausami 2013-03-08 02:05:08

+0

不客氣':D' – 2013-03-08 02:06:24

0

這裏是可以拆分逗號分隔列表中的一個方式使用For XML:這導致

SELECT w.workid, w.name, 
    STUFF((
    SELECT ',' + E.Name AS [text()] 
    FROM (
     SELECT A.workid, 
     Split.a.value('.', 'VARCHAR(100)') AS EmpId 
     FROM 
     (SELECT workid, 
     CAST ('<M>' + REPLACE(employees, ',', '</M><M>') + '</M>' AS XML) AS String 
     FROM work 
    ) AS A 
     CROSS APPLY String.nodes ('/M') AS Split(a) 
    ) A 
    JOIN employees E ON A.EmpId = E.Id 
    WHERE WorkId = w.WorkId 
    FOR XML PATH('') 
), 1, 1, '') AS Employees 
FROM work w 

SQL Fiddle Demo

WORKID NAME EMPLOYEES 
1  task1 john,leah 
2  task2 peter,leah 
3  task3 john,leah,frank 
4  task4 peter 
+0

謝謝sgeddes。你的答案將起作用。但我要求客戶端更改表格模式以使結構正常化,以便解決問題。再次感謝。 – Mausami 2013-03-08 02:04:29

相關問題