首页 > 解决方案 > 如何获得第 1 列 = 1 和第 1 列 = 2 的结果?

问题描述

如何获得第 1 列 = 1 和第 1 列 = 2 的结果?假设我有三个表,需要以下输出:

员工表

eid      name
1        john
2        jack
3        matt

服务表

sid service
1   shipping
2   delivering
3   storing
4   accounting

Employee_Service 表

esid eid sid  
1    1   1
2    1   2
3    1   3
4    2   1
5    2   4
6    3   1
7    3   3
8    3   4

当我在 where 子句中写“and”而不是“or”时,此代码不起作用

SELECT e.[eID],
       e.name,
       s.sid
FROM [dbo].[Employee] e
     LEFT JOIN dbo.employee_service es ON e.eid = es.eid
     LEFT JOIN dbo.service s ON es.sid = s.sid
WHERE s.service = 'shipping'
  AND s.service = 'storing';

结果应该是这样的

eid  name  sid 
1    john  1    
1    join  3   
3    matt  1    
3    matt  3    

展望未来,我希望得到这样的结果:

eid   name   sid   sid
1     john   1      3
3     matt   1      3

谢谢!

标签: sql-serverwhere-clause

解决方案


我将使用此查询来获得所需的结果。

SELECT DISTINCT
e.eid
,e.name
,s_sid
FROM dbo.employee e
INNER JOIN 
(
 SELECT es.eid, s.sid,
    s_sid = STUFF(
                  (
                   SELECT ' ' + CONVERT(char(1), s.sid)
                   FROM  dbo.employee_service e_s 
                   INNER JOIN dbo.service s ON e_s.sid = s.sid
                   WHERE es.eid = e_s.eid 
                   AND s.sid IN(1, 3) -- change sid to change the service
                   FOR XML PATH(''))
            , 1, 1, '')
 FROM dbo.employee_service es 
 INNER JOIN dbo.service s ON es.sid = s.sid
) t ON e.eid = t.eid
WHERE s_sid = '1 3' -- change this according to the sid you chose previously

不是每个服务都有不同的列,而是将“sid”塞入一行并用空格分隔(感谢 STUFF 功能)。然后如果你改变我注释的子句的参数,你可以根据 sid 号得到你想要的任何结果。希望这有帮助!


推荐阅读