获取同一表中不同行中匹配字段的所有行

时间:2013-08-07 13:38:54

标签: sql hive impala

假设我有一张这样的表:

|id|userID|email         |website    |
--------------------------------------
|1 |user1 |user1@test.com|website.com|
|2 |user2 |user2@test.com|website.com|
|3 |user3 |user3@test.com|website.com|
|4 |user1 |user1@test.com|foo.com    |
|5 |user2 |user2@test.com|foo.com    |

我希望得到所有的行,其中的网站='website.com',并且相应的行包含匹配的userID,其中website ='foo.com'

因此,在这种情况下,它将返回第1行和第2行。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这是一种方式:

select t.*
from t
where t.website = 'website.com' and
      exists (select 1 from t t2 where t2.userId = t.userId and t2.website = 'foo.com');

编辑:

您也可以将此表达为加入:

select distinct t.*
from t join
     t2
     on t2.userId = t.userId and
        t.website = 'website.com' and
        t2.website = 'foo.com';

如果您知道没有重复项,则可以删除distinct

答案 1 :(得分:1)

为了让用户可以做到

select userID
from your_table
where website in ('website.com', 'foo.com')
group by userID
having count(distinct website) = 2

但如果您需要完整的行,请执行

select * from your_table
where userID in
(
   select userID
   from your_table
   where website in ('website.com', 'foo.com')
   group by userID
   having count(distinct website) = 2
)

答案 2 :(得分:1)

Hive在使用子查询(FROM子句中的are only allowed)方面有限,所以我们必须解决这个问题。好消息是,我们不必担心(很多)关于进行大规模连接,因为,好吧,Hadoop。 : - )

在表中查找匹配行的一种方法是简单地将表连接到自身。

SELECT left.*
FROM your_table left
JOIN your_table right
ON (left.userID = right.userID)
WHERE left.website = 'website.com'
AND right.website = 'foo.com';

请注意,我们有两个版本的同一个表,分别称为leftright,我们正在检索leftright中匹配行的行具有相同的userID(JOIN条件)但网站是foo.com(and子句)。

希望有所帮助。