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

cs7cruho  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(343)

假设我有一张这样的table:

|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行。
有什么想法吗?

bnlyeluc

bnlyeluc1#

有一种方法:

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 .

k4ymrczo

k4ymrczo2#

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';

注意,同一个表有两个版本,称为 left 以及 right 我们分别从 left 中有匹配行的 right 具有相同用户ID的( JOIN 但网站是foo.com( and 条款)。
希望有帮助。

o4tp2gmn

o4tp2gmn3#

为了获得用户,你可以做

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
)

相关问题