我可以在用户定义的函数中使用子查询吗

Posted

技术标签:

【中文标题】我可以在用户定义的函数中使用子查询吗【英文标题】:Can I use subquery in a user-defined function 【发布时间】:2019-01-06 05:23:03 【问题描述】:

我尝试在 mysql 自定义用户定义函数中使用子查询我得到一个错误所以你能帮我举一个例子吗? 这是我的代码:

CREATE DEFINER=`root`@`localhost` FUNCTION `findsubName`(counts INT) 
RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE result VARCHAR(500) DEFAULT NULL;
DECLARE v_name VARCHAR(200);
DECLARE finished INT(1) DEFAULT 0;
DECLARE my_cursor CURSOR FOR
   SELECT id, (SELECT t_name FROM ajctb_titles b WHERE a.jt_id=b.t_id)
   as tableName FROM ajctb_vacancies a limit counts;

   DECLARE CONTINUE HANDLER 
   FOR NOT FOUND 
   SET finished = 1;

   OPEN my_cursor;
   calc_change: LOOP
   FETCH my_cursor INTO v_name;

   IF finished THEN
     LEAVE calc_change;
   END IF;
   IF result<>'' THEN 
     SET result = CONCAT_WS(',',result,v_name);
   ELSE
     SET result = v_name;
   END IF;
   END LOOP calc_change;
   CLOSE my_cursor;
  RETURN result;
END

错误信息: 错误代码:1328。FETCH 变量数不正确

【问题讨论】:

【参考方案1】:

错误信息:错误代码:1328。FETCH 变量的数量不正确

错误消息试图告诉您问题所在。它在 FETCH 中。查看文档:

13.6.6.3 游标 FETCH 语法

FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...

此语句获取下一行 与指定游标关联的 SELECT 语句(必须是 打开),并前进光标指针。如果存在一行,则提取的 列存储在命名变量中。 列数 SELECT语句检索到的输出数必须匹配 FETCH 语句中指定的变量。 https://dev.mysql.com/doc/refman/8.0/en/fetch.html

您的查询中有 2 列:

SELECT
    id
  , (
        SELECT
            t_name
        FROM ajctb_titles b
        WHERE a.jt_id = b.t_id
    )
    AS tableName

表示 FETCH 需要 2 个变量

它甚至还没有尝试子查询。

关于相关子查询,这可能是个问题。当您在这样的 select 子句中使用子查询时,它必须返回不超过一个值。因此,如果您继续该子查询,您应该使用 limit 1

该子查询可以替换为连接。例如

SELECT
    id
  , b.t_name AS tableName
FROM ajctb_vacancies a
LEFT JOIN ajctb_titles b ON a.jt_id = b.t_id

如果您必须始终返回一个非空表名,您可能需要使用INNER JOIN

【讨论】:

以上是关于我可以在用户定义的函数中使用子查询吗的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 查询从 BigQuery 用户定义函数返回值

优化 MySQL 查询,避免对用户自定义函数的不必要调用

SQL Fundamentals: 子查询 || 分析函数

在子查询中使用聚合和窗口函数

雄辩的子查询中的 whereIn 函数不会过滤任何记录

是否可以使用 sass 函数在媒体查询中从父宽度动态获取子高度? [复制]