0

假设我有一张这样的桌子:

|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='website.com' 的所有行,并在 website='foo.com' 有一个匹配的 userID 对应的行

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

有任何想法吗?

4

3 回答 3

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.

于 2013-08-07T13:41:56.447 回答
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
)
于 2013-08-07T13:41:14.423 回答
1

Hive 在使用子查询方面有点限制(它们只允许FROM子句中),所以我们必须解决这个问题。好消息是我们不必(太多)担心进行大规模连接,因为,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,我们正在从中检索left具有匹配行的行,right该行具有相同的用户 ID(JOIN条件)但网站是 foo.com(and子句)。

希望有帮助。

于 2013-08-08T06:34:42.110 回答