我有一个嵌套的SQL查询,展示了我无法理解的结果。该查询通过PARTNER_USER表连接PARTNER和USER表。合作伙伴基本上是用户的集合,此查询的目的是确定第20个用户何时向具有ID 34的合作伙伴注册:
select p.partner_id id,
u.created_on launch_date
from user u join partner_user pu
using (user_id) join partner p
using (partner_id)
where p.partner_id = 34
and u.user_id =
(select nu.user_id
from user nu
join partner_user npu using (user_id)
join partner np using (partner_id)
where np.partner_id = 34
order by nu.created_on limit 19, 1)
但是,如果我将第二行更改为
where np.partner_id = p.partner_id
查询失败,并显示错误消息“Subquery返回多行”。 为什么第一个查询有效,但不是第二个?它们看起来与我相当。
谢谢, 唐
答案 0 :(得分:3)
JPunyon是对的。必须首先运行一个或另一个查询,然后在事后修剪其结果。
如果查看所写的查询,外部查询必须知道内部查询的结果以应用其where子句。但是,当您指定
时where np.partner_id = p.partner_id
在内部查询中,然后您尝试使内部查询知道外部查询的结果以应用其where子句。那是循环依赖。
作为一个人,你可以阅读查询,你可以告诉你,在这种特殊情况下,你在外部查询的where子句中要求一个特定的值,并且你要求在内部查询,所以好像数据库应该看到它并使用外部查询中相同的文字值。
实际上,只需先运行内部查询而不知道p.partner_id
的可能值,因此会出现“多行”错误。
答案 1 :(得分:1)
使用=运算符与子查询的结果进行比较时,子查询可能只返回一行。 如果要检查子查询返回的所有行,则必须使用IN运算符。
AND u.User_Id IN ( SELECT .... )
答案 2 :(得分:0)
当您更改子查询中的where子句时,您将打开闸门。主查询中的where子句不限制子查询。所以你得到的结果不止一个。
编辑:这是什么数据库?我之前没有遇到“使用”构造......答案 3 :(得分:0)