假设我有一张这样的表:
|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行。
有什么想法吗?
答案 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';
请注意,我们有两个版本的同一个表,分别称为left
和right
,我们正在检索left
中right
中匹配行的行具有相同的userID(JOIN
条件)但网站是foo.com(and
子句)。
希望有所帮助。