2017-05-26 1 views
0

以前のクエリの結果の結果に応じて3番目のテーブルを更新したいとします。私はこれまでのところクエリスクリプトの後続のクエリでマルチライン応答を処理する

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

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

はそう簡単に何を意味するかを示すために

サンプル。しかし、TABLE1が複数行の結果を返す場合は、どうすれば対処できますか。 私はmyBatis "MIGRATE"スクリプトでこれを行う必要があります。プログラムのサポートはありません。単純なSQLです。 ThjeデータベースはMySQLです。

答えて

0

私はまだ見唯一の方法は、ストアドプロシージャ

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; 
を使用することです
関連する問題