我在我的网站上使用sql server 2008 r2和php。 我有2张桌子。
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
我想查询哪个给我工作描述,员工姓名类型< 3。
意味着我想得到这样的结果。
workid name employee
1 task1 john, leah
2 task2 peter, leah
3 task3 john,leah,frank
明智的
那么如何用sql查询实现这个结果呢?
我无法更改表架构。
我尝试使用case语句但它不起作用。
请帮助我解决这个问题..
答案 0 :(得分:2)
这个内容并不完全回答这个问题,但它会建议你如何正确地规范化表格,以便简化问题。
这是Many-to-Many
关系。
Employees
- ID (Primary Key)
- Name
- Type
Task
- ID (Primary Key)
- Name
Work
- EmployeeID (Foreign Key)
- TaskID (Foreign Key)
员工表
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
答案 1 :(得分: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
这导致:
WORKID NAME EMPLOYEES
1 task1 john,leah
2 task2 peter,leah
3 task3 john,leah,frank
4 task4 peter