mysql - 在查询脚本中的后续查询中使用多行响应

标签 mysql mybatis multiline

我想根据先前查询的多行结果更新第三张表。

样本以显示我的意思

SET @NAME1='name1';
SET @NAME21='name21';
SET @NAME22='name22';
SET @ID1  = (SELECT ID1 FROM TABLE1 WHERE NAME=@NAME1);
SET @ID21 = (SELECT ID2 FROM TABLE2 WHERE NAME=@NAME21);
SET @ID22 = (SELECT ID2 FROM TABLE2 WHERE NAME=@NAME22);

INSERT INTO TABLE3 ('ID1', 'ID2')
   VALUES(@ID1, @ID21);
INSERT INTO TABLE3 ('ID1', 'ID2')
   VALUES(@ID1, @ID22);


到目前为止很容易。但是,如果TABLE1返回多行结果,我该如何处理。
我必须在myBatis的“ MIGRATE”脚本中执行此操作;没有任何程序支持;只是普通的SQL。数据库是MySQL。

最佳答案

我看到的唯一方法是使用存储过程

DROP PROCEDURE IF EXISTS UpdateWithSuppliedName;

DELIMITER $$

CREATE PROCEDURE UpdateWithSuppliedName( IN aName VARCHAR(20) )
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE id INT;
    DECLARE myCursor CURSOR FOR SELECT t1id FROM table1 WHERE NAME=aName;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- Fail if supplied name is not defined
    SET @size = (SELECT count(*) from table1 WHERE NAME=aName);
    IF @size = 0 THEN
       SIGNAL SQLSTATE '45000' 
       SET MESSAGE_TEXT = "Supplied name does not exist in table1";
    END IF;

    -- Fail if expected name2 is not there in table2
    SET @size = (SELECT count(*) from table2 WHERE NAME="NAME21");
    IF @size = 0 THEN
       SIGNAL SQLSTATE '45000' 
       SET MESSAGE_TEXT = "The name 'NAME21' does not exist in table2";
    END IF;

    -- Fail if expected name2 is not there in table2
    SET @size = (SELECT count(*) from table2 WHERE NAME="NAME22");
    IF @size = 0 THEN
       SIGNAL SQLSTATE '45000' 
       SET MESSAGE_TEXT = "The name 'NAME22' does not exist in table2";
    END IF;

    SET @id21 = (SELECT t2id from table2 WHERE NAME="NAME21");
    SET @id22 = (SELECT t2id from table2 WHERE NAME="NAME22");

    OPEN myCursor;
    read_loop: LOOP
       FETCH myCursor INTO id;
       IF done THEN
         LEAVE read_loop;
       END IF;

       INSERT INTO table3 (t1id, t2id) VALUES (id, @id21);
       INSERT INTO table3 (t1id, t2id) VALUES (id, @id22);

    END LOOP;

    CLOSE myCursor;

END $$

DELIMITER ;

call UpdateWithSuppliedName("NAME11");

-- cleanup
DROP PROCEDURE IF EXISTS UpdateWithSuppliedName;

关于mysql - 在查询脚本中的后续查询中使用多行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44197324/

相关文章:

java - MyBatis/Ibatis :- Help regarding query in Ibatis/Mybatis

jakarta-ee - Mybatis:log4j:WARN 找不到记录器的附加程序 (org.apache.ibatis.logging.LogFactory)

javascript - 在 Javascript 字符串中奇怪地使用反斜杠

java - 带有 textMultiLine 的 EditText 不起作用

php - 在 PHP 中,如何在呈现的文本中不出现新行的情况下在多行中表达字符串文字?

php - ID 的唯一性

java - 正确使用 AsyncTasks 并处理 View 和 Activity 所需的对象

Mysql 查询 Select 语句需要帮助

php - 如何从mysql表中选择所有电子邮件并将其分配给php中邮件函数的$to?

mybatis 和 ibatis 不支持 jdbcType=BIGDECIMAL