Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从另一个表中具有匹配id的另一个表中获取名称?_Sql_Sql Server 2008 R2 - Fatal编程技术网

Sql 如何从另一个表中具有匹配id的另一个表中获取名称?

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是为了工作 (

我在我的网站上使用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)

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