连接解决方​​案的子查询等效项

subquery equivalent for a join solution

我们有两个表,用户,电子邮件。他们在 User.id == Emails.user_id 上有关系。如果我们对那些拥有多个不同电子邮件的用户感兴趣,使用 join 我们可以通过 JOIN:

SELECT * FROM User 
  JOIN Emails as EM1 ON User.id = Emails.user_id
  JOIN Emails as EM2 ON User.id = Emails.user_id
   Where EM1.address_line != EM2.address_line;

我们如何使用 subquery 获得相同的结果?

您可以使用仅从 Emails returned user_id 的子查询,其中用户有多个电子邮件地址。

然后加入 User table 那个 user_id:

SELECT  *
  FROM  User u
    INNER JOIN (
               SELECT  user_id
                 FROM  Emails
                 GROUP BY user_id
                 HAVING COUNT(*) > 1
               ) a ON a.user_id = u.id

子查询只会 return user_id 当在 Emails table 中有 多行 时用户,这就是你要的。

注意:SQL 未经测试。

您可以使用相关子查询:

select u.*
from users u
where (select count(*)
       from emails e
       where e.user_id = u.id
      ) >= 2;