0

我有一个嵌套的 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

查询失败并显示错误消息“子查询返回超过 1 行”。为什么第一个查询有效,而第二个查询无效?他们看起来和我一样。

谢谢,唐

4

4 回答 4

3

JPunyon 是对的。一个或另一个查询必须首先运行,然后在事后修剪其结果。

如果您查看编写的查询,则外部查询必须知道内部查询的结果才能应用其 where 子句。但是,当您指定

where    np.partner_id = p.partner_id

在内部查询中,然后您试图使内部查询知道外部查询的结果以应用其 where 子句。这是一个循环依赖。

作为人类,您可以阅读查询,并且可以看出在这种特殊情况下,您在外部查询的 where 子句中要求一个特定的值,而您要求在内部查询中使用相同的值,所以似乎数据库应该看到并使用外部查询中的相同文字值。

实际上,内部查询只是在不知道 的可能值的情况下首先运行p.partner_id,因此出现“多行”错误。

于 2009-01-20T20:49:30.843 回答
1

当您使用 = 运算符与子查询的结果进行比较时,您的子查询可能只返回一行。如果要检查子查询返回的所有行,则必须使用 IN 运算符。

AND u.User_Id IN ( SELECT .... )
于 2009-01-20T20:31:14.780 回答
0

当您更改子查询中的 where 子句时,您将打开闸门。主查询中的 where 子句不限制子查询。所以你得到的结果不止1个。

编辑:这是什么数据库?我之前没有遇到过“使用”构造......

于 2009-01-20T20:37:29.167 回答
0

@Jason Punyon mysql 支持 USING 构造。

于 2010-07-31T16:49:17.163 回答