难以理解的内部查询

时间:2009-01-20 20:27:03

标签: mysql sql mysql-error-1242

我有一个嵌套的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返回多行”。 为什么第一个查询有效,但不是第二个?它们看起来与我相当。

谢谢, 唐

4 个答案:

答案 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)

@Jason Punyon mysql支持USING构造。