连接解决方案的子查询等效项
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;
我们有两个表,用户,电子邮件。他们在 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;