Sql 如何从另一个表中具有匹配id的另一个表中获取名称?
我在我的网站上使用sql server 2008 r2和php。 我有两张桌子 1是给员工的Sql 如何从另一个表中具有匹配id的另一个表中获取名称?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我在我的网站上使用sql server 2008 r2和php。 我有两张桌子 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)
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 when语句,但它不起作用
请帮助我使其正常工作。这篇文章的内容并不能完全回答问题,但它将建议您如何正确地规范化表格,以便简化问题 这是一种多对多关系
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
- 有一种方法可以使用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
为什么不能更改表架构?真是糟透了!将整数数组存储为字符串。数据库不是设计用来进行这种搜索的。所以你必须使用很多非常昂贵的操作来运行。您至少应该(!)将该列转换为集
。好多了:看看JW的帖子!假设你不能改变你的表结构,看看我的帖子——应该能满足你的需要。如果可以更改表结构,请查看JW的答案,因为它更适合规范化。我只是不想假设你可以改变你的数据库结构。谢谢你。你的答案会有用的。但我要求客户端更改表模式以规范化结构,这样我的问题就解决了。再次非常感谢。谢谢JW。我要求客户机更改模式并规范化表。
WORKID NAME EMPLOYEES
1 task1 john,leah
2 task2 peter,leah
3 task3 john,leah,frank
4 task4 peter