在单个表上需要有关内部联接查询的帮助

时间:2017-04-21 10:41:24

标签: sql database hive

我有一个名为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和其他数据,这些数据是MATCH和一个job_id,而输入id在另一组作业id中是NO MATCH。但是这个查询需要更长的时间,因为这些表包含数百万条记录而且我没有看到结果呢。(Fyi,我正在使用蜂巢表)任何有效或任何不同的更好的方式来做这个!谢谢

2 个答案:

答案 0 :(得分:-1)

如果我试着理解这一点:"我需要input_id。 。 。这是与一个job_id的MATCH和输入id在另一组作业ID"中的NO MATCH,然后你可以使用聚合:

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_idjob_id没有重复,这似乎与问题中的数据一致。

如果您想要原始数据行,那么您可以join进入查询:

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;

答案 1 :(得分:-2)

从TEST中选择* match_outcome ='NO_MATCH'