标量子查询包含多于一行
Posted
技术标签:
【中文标题】标量子查询包含多于一行【英文标题】:Scalar subquery contains more than one row 【发布时间】:2016-11-12 17:00:35 【问题描述】:我正在使用 H2 数据库并想移动一些数据。为此,我创建了以下查询:
UPDATE CUSTOMER
SET EMAIL = SELECT service.EMAIL
FROM CUSTOMER_SERVICE AS service
INNER JOIN CUSTOMER AS customer ON service.ID = customer.CUSTOMER_SERVICE_ID;
当我现在在 H2 控制台中执行它时,我收到以下错误:
Scalar subquery contains more than one row; SQL statement:
UPDATE CUSTOMER
SET EMAIL = SELECT service.EMAIL
FROM CUSTOMER_SERVICE AS service
INNER JOIN CUSTOMER AS customer ON service.ID = customer.CUSTOMER_SERVICE_ID [90053-192] 90053/90053 (Hilfe)
这个错误告诉我什么?
编辑
我想通过查询实现什么:
实际上每个CUSTOMER
都有一个CUSTOMER_SERVICE
。我只是想将COLUMN EMAIL
从CUSTOMER_SERVICE
移动到CUSTOMER
表。为此,我已经向用户添加了一个电子邮件列。我希望能够用我的查询来做到这一点,但显然不是。
【问题讨论】:
【参考方案1】:您的查询在语法上无效(所有子查询都必须有括号)。
您缺少的是相关性子句。我相信你想要:
UPDATE CUSTOMER c
SET EMAIL = (SELECT cs.EMAIL
FROM CUSTOMER_SERVICE s
WHERE s.ID = c.CUSTOMER_SERVICE_ID
);
我不知道这应该是什么:[90053-192] 90053/90053 (Hilfe)
。
【讨论】:
[90053-192] 90053/90053 (Hilfe) 是 H2 的错误代码 (h2database.com/javadoc/org/h2/api/ErrorCode.html#c90053):SCALAR_SUBQUERY_CONTAINS_MORE_THAN_ONE_ROW(当用作值的子查询包含超过一行)。【参考方案2】:您的选择查询返回不止一行。如果您不希望这样做,则需要执行聚合或 LIMIT 1 之类的操作。
【讨论】:
但我希望对我拥有的每个客户执行 taht 查询。【参考方案3】:您对至少一位客户的子查询有多个电子邮件地址。
你可以... (Select top 1 serverice.email ...
或... (Select max(serverice.email) ...
Update Customer Set EMail=B.Email
From Customer A
Join (Select ID,max(EMail) as EMail From CUSTOMER_SERVICE Group By ID) B
on (A.CUSTOMER_SERVICE_ID = B.ID)
【讨论】:
@Mulgard BINGO! @Mulgard 我的第一选择是 max() 选项 @Mulgard 如果有多封电子邮件,您是否希望将它们视为 DISTINCT 分隔字符串? @Mulgard 如果有多个不同的电子邮件,您要输入最后一个吗? @Mulgard 查看更新的答案...完整更新声明【参考方案4】:我在这种错误类型上花了很多时间(数据库中不应有重复项)。 最后我通过 SQL 发现了 COUNT 的问题,如下所示:
UPDATE CUSTOMER
SET EMAIL = SELECT COUNT(service.EMAIL)
FROM CUSTOMER_SERVICE AS service
INNER JOIN CUSTOMER AS customer ON service.ID =
customer.CUSTOMER_SERVICE_ID;
然后用EMAIL!='1'
选择问题行
【讨论】:
以上是关于标量子查询包含多于一行的主要内容,如果未能解决你的问题,请参考以下文章