2017-04-21 63 views
1

我已經叫TEST如下單表:要求對內部幫助連接查詢在單臺

job_id input_id match_outcome 
101  1   MATCH 
101  2   NO_MATCH 
201  1   NO_MATCH 
201  2   MATCH 

預期成果:

job_id input_id match_outcome 
201  1   NO_MATCH 
101  2   NO_MATCH 

查詢我所用:

select * 
from (select * from TEST where job_id = '101') q1 join 
    (select * from TEST where job_id = '201') q2 
where q1.match_outcome= 'MATCH' and q2.match_outcome= 'NO_MATCH' OR 
     q2.match_outcome= 'MATCH' and q1.match_outcome= 'NO_MATCH' 

總體客觀: 我需要input_id和其他數據是匹配的一個job_id和輸入id是沒有MA TCH在另一組工作id.But這個查詢需要更長的時間,因爲這些表包含數百萬條記錄,我沒有看到結果(Fyi,我使用的是配置表)任何有效或任何不同的更好的方式來做這件事!由於

+0

沒人問這個問題只是:

如果你想在原來的數據行,那麼你可以join到這個查詢大約一小時前?檢查這個問題的答案! – jarlh

+0

認真對待。雖然在文本格式中,它仍然是不清楚的數據樣本。 –

+0

我做了..我刪除/關閉了它。因爲我附上了多個屏幕截圖o解釋 –

回答

-1

如果我試着去了解這一點:「我需要input_id這是配合一個JOB_ID和與輸入ID是另一套作業ID不匹配」,那麼你可以使用聚合:

select input_id 
from text 
group by input_id 
having sum(case when match_outcome = 'MATCH' then 1 else 0 end) > 0 and 
     sum(case when match_outcome = 'NO MATCH' then 1 else 0 end) > 0; 

這假定input_id不會重複給予job_id,這似乎與問題中的數據一致。從測試

select t.* 
from test t join 
    (select input_id 
     from text 
     group by input_id 
     having sum(case when match_outcome = 'MATCH' then 1 else 0 end) > 0 and 
      sum(case when match_outcome = 'NO MATCH' then 1 else 0 end) > 0 
    ) i 
    on t.input_id = i.input_id; 
+0

downvote的解釋?我認爲這是對這個問題的準確解釋。 –

-2

選擇*如果match_outcome =「NO_MATCH」