如何获得第1列= 1和第1列= 2的结果?

时间:2018-06-26 07:44:32

标签: sql-server where-clause

在第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子句而不是“ or”中写“ and”时,此代码不起作用

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

谢谢!

3 个答案:

答案 0 :(得分:0)

进入类似格式

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

您应该有条件聚合

SELECT e.[eID],
       e.name,
       shipping= MAX(CASE WHEN s.service='shipping' THEN s.sid END),
       storing= MAX(CASE WHEN s.service='storing' THEN s.sid END)
FROM [dbo].[Employee] e
     JOIN dbo.employee_service es ON e.eid = es.eid
      JOIN dbo.service s ON es.sid = s.sid
WHERE s.service in( 'shipping', 'storing')
GROUP BY  e.[eID],e.name HAVING COUNT(1)=2;

See this demo

答案 1 :(得分:0)

使用OR代替AND。同一列不能连续获得两个不同的值。

如果您不希望获得空列结果(如果另一个表中不存在其中一个值),那么我将使用INNER JOINS而不是LEFT JOIN。

总是最好使用ID进行过滤

因此“在s.sid = 1或s.sid = 3的地方”或更容易的“在(1,3)中的s.sid的地方”

这应该有效:

SELECT e.[eID],
       e.name,
       s.sid
FROM [dbo].[Employee] e
     INNER JOIN dbo.employee_service es ON e.eid = es.eid
     INNER JOIN dbo.service s ON es.sid = s.sid
WHERE s.sid in (1,3)

答案 2 :(得分:0)

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

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编号获得所需的任何结果。 希望这会有所帮助!