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