我有下一张桌子 - Task(id, type, sessionId, termination, scenario)
我有一个sessionId
列表。
我想选择此会话常用的所有任务。如果任务具有相同的类型,终止和方案,则它们是等于的。
示例 -
| id | type | sessionId | termination | scenario |
1 A 20 duration sc1
2 B 20 invocation sc1
3 C 20 duration sc2
4 A 21 duration sc1
5 B 21 invocation sc1
对于sessionId
列表等于(20,21) - 我想获得下一个信息
| id | type | sessionId | termination | scenario |
1 A 20 duration sc1
2 B 20 invocation sc1
4 A 21 duration sc1
5 B 21 invocation sc1
具有ids = 1,2,4,5的任务对于会话20和21是常见的。
我设计下一个查询 -
select l.* from Task l
inner join(select p.* from Task p
where
p.sessionId in (20,21)
group by
p.type,
p.termination,
p.scenario
having
count(p.id)=2)s
on
l.type=s.type
and l.scenario=s.scenario
and l.termination=s.termination;
这是获取此类信息的最佳方式吗?也许有一个更好的查询,它只包含一个select
操作并且工作得更快?
答案 0 :(得分:0)
这是方法。查找与所有会话匹配的所有对类型,终止和方案。然后加入tasks
表以获取所有信息:
select t.*
from tasks t join
(select type, termination, Scenario
from tasks
where sessionId in (20, 21)
group by type, termination, scenario
having count(distinct sessionId) = 2
) tts
on tts.type = t.type and tts.termiantion = t.termination and tts.scenario = t.scenario
where t.sessionId in (20, 21);
您需要更改列表和2
(如果您更改列表的大小)。
答案 1 :(得分:0)
我的下面的代码不限于sessionID
的任何特定子集。
SELECT t1.*
FROM Task AS t1 INNER JOIN Task AS t2 ON t1.type = t2.type AND t1.termination = t2.termination AND
t1.scenario = t2.scenario AND t1.sessionid <> t2.sessionid AND
t1.id <> t2.id
ORDER BY t1.id
这里的SQL小提琴:http://sqlfiddle.com/#!2/55d7c/9随意尝试。
我有点误解了你的要求吗?