标量子查询包含多于一行

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 EMAILCUSTOMER_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'选择问题行

【讨论】:

以上是关于标量子查询包含多于一行的主要内容,如果未能解决你的问题,请参考以下文章

mysql 标量子查询和非法子查询

数据库子查询 含义-分类-语句

得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”

子查询结果 '单行子查询结果多于一行'

多表查询

通过三层标量子查询传递数据