12

以下查询似乎仅在有一个dateOfBirth设置为的条目时才有效1975-02-28

当有多个记录匹配此条件时,它会失败。

是否可以在不使用子查询的情况下删除属性dateOfBirth设置为的用户的所有地址?1975-02-28

SELECT @id:=(SELECT id
             FROM USER
             WHERE dateOfBirth='1975-02-28');
DELETE FROM Address
WHERE user_id=@id;

我得到的确切错误是:Error Code: 1242 Subquery returns more than 1 row..

4

3 回答 3

4

该错误意味着当您尝试将 id 分配给变量时,您的内部查询没有返回单行。

SELECT id
FROM USER
WHERE dateOfBirth='1975-02-28'

通过查询为变量赋值应该始终是单行结果。如果要存储多列结果,可以执行以下操作:

SELECT field_1, field_2, field_3 INTO @var_a, @var_b, @var_c FROM any_table

但是既然你问了这个:

是否可以在不使用子查询的情况下删除属性dateOfBirth设置为的用户的所有地址?1975-02-28

正如 Tonio 所说,将您的 DELETE 查询更改为他的建议,它会起作用。

DELETE FROM Address WHERE user_id IN (SELECT id FROM USER WHERE dateOfBirth='1975-02-28');

于 2015-09-01T13:53:29.860 回答
1

如果有多个这样的条目,SELECT子查询将返回一个 ID 表。

你不能让一个 ID 等于一个表。尝试这个:

DELETE FROM Address
WHERE user_id IN (SELECT id
                  FROM USER
                  WHERE dateOfBirth='1975-02-28');

编辑:

看起来,根本不可能在 MySQL 变量中存储多个值,就像在以下查询中尝试的那样:

SELECT @ids:=(SELECT id
              FROM USER
              WHERE dateOfBirth='1975-02-28');

这种解释主要基于许多人写这篇文章(通常被提及“据我所知”限定)。

我可以找到许多这样的答案,并且没有任何页面会反对这种说法。可以在 SO 上找到这些答案的几个示例(例如:https ://stackoverflow.com/a/3156565/3401018 )。

我倾向于相信这很可能是真的。无论如何,正如您在我的回答的第一部分中看到的那样,在这种特殊情况下,您实际上不需要通过变量。

于 2014-07-03T11:43:39.467 回答
0

问题是子查询返回多个 ID,如果您只需要 1 个 ID,则应限制limit 1子查询末尾的结果说明。

另一方面,joins 提供了更好的解决方案:

delete a from address a join user u on (a.user_id=u.id) 
where u.dateOfBirth='1975-02-28';
于 2018-10-29T17:43:25.803 回答