2013-04-01 149 views
0

我有下一個表 - 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) - I想獲取下一個信息

| 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

以下是方法。找到與所有會話匹配的所有類型,終端和場景。然後加入早在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(如果更改列表的大小)。

+0

這是一個很好的決定!但有沒有辦法不使用2「選擇」操作? –

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隨意試驗。

我有些誤解了你的要求嗎?

+0

您的決定取決於sessionId列表的大小。它可以超過兩個會話) –

+0

我的意圖是建立一個不依賴於會話數量的查詢:查找所有**匹配** 3個關鍵字段和**不匹配**'id'和'sessionid'。這是一個錯誤的方法? –

+0

您可以添加'AND t1.sessionid IN(20,21)和t2.sessionid IN(20,21)'。如果你有多個會話ID,那麼無論如何你都需要拋出一個「GROUP BY」,這可能是你的原始查詢會更快。 (但是你應該首先介紹一下。) – Neil