【问题标题】:Error: subquery Returns more than one row错误:子查询返回多于一行
【发布时间】:2014-10-15 12:19:31
【问题描述】:

您好,我一直在尝试通过 CallableStatement 调用过程来选择多行。当我尝试将结果集填充到组合框时,代码返回错误如下。

Java 错误:

                   java.sql.SQLException: Subquery returns more than 1 row

存储过程:

CREATE DEFINER=`user_name`@`%` PROCEDURE `GET_USER_PROFILE`(
            IN p_user_id VARCHAR(150),
            IN p_role VARCHAR(150),
            OUT p_user_data VARCHAR(200),
            OUT p_city VARCHAR(150),
            OUT p_state VARCHAR(150),
            OUT p_country VARCHAR(150),
            OUT q_Msg VARCHAR(150))
BEGIN

DECLARE available INT DEFAULT 0;
 SET p_city = (SELECT CITY FROM countries GROUP BY CITY);
 SET p_state = (SELECT STATE FROM countries GROUP BY STATE);
 SET p_country = (SELECT COUNTRY FROM countries GROUP BY COUNTRY);

SELECT COUNT(EMAIL) INTO available FROM STAFF_PROFILE WHERE EMAIL = p_user_id AND ROLE = p_role;

IF(available=1) THEN
        SET p_user_data = (SELECT * FROM STAFF_PROFILE WHERE EMAIL = p_user_id AND ROLE = p_role );
else
    SET q_Msg = 'USER_LOGGED_FIRST';
END IF;

END

【问题讨论】:

  • 我不喜欢这样的外观 ..."SET p_city = (SELECT CITY FROM countries GROUP BY CITY);" 大概该查询可以返回多行(否则为什么要 GROUP BY ),您将其分配给 VARCHAR 你会怎么做期望 VARCHAR 持有?
  • @DaveHowes 我需要将值填充到前端的城市、州和国家组合框中
  • 问题出在您的 SQL 中,而不是在 Java 代码中。在一些工具中测试你的 SQL

标签: java mysql jdbc callable-statement


【解决方案1】:

@DaveHowes 和@Ilya 是正确的,问题在于您的 SQL 语句。

假设在您的国家/地区表中包含以下内容:

城邦国家 '纽约' '纽约' '美国' '洛杉矶' '加利福尼亚' '美国' '芝加哥' '伊利诺伊州' '美国' '渥太华''''加拿大'

现在,如果我们从您的示例中获取您的子查询:

SELECT city FROM countries GROUP BY city

会返回:

城市 '纽约' '洛杉矶' '芝加哥' “渥太华”

您正在尝试将多个结果分配给 varchar,因此您会收到异常“子查询返回超过 1 行”。

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 2014-02-15
    • 2013-09-07
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多