以下查询似乎只有在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.
。
答案 0 :(得分:2)
错误意味着当您尝试将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查询更改为他的建议并且它会起作用。
删除地址 WHERE user_id IN(SELECT id 来自用户 在哪里dateOfBirth =' 1975-02-28');
答案 1 :(得分:0)
如果有多个此类条目,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)。
我倾向于认为这很可能是真的。在任何情况下,正如您在我的答案的第一部分所看到的那样,在这种特定情况下,您实际上并不需要通过变量。
答案 2 :(得分:0)
问题是子查询返回的ID不只一个,如果只需要1个ID,则应限制结果,在子查询末尾声明limit 1
。
另一方面,通过连接可以更好地解决该问题:
delete a from address a join user u on (a.user_id=u.id)
where u.dateOfBirth='1975-02-28';