2017-05-26 1 views
0

Ich möchte eine dritte Tabelle abhängig von dem Ergebnis der mehrzeiligen Ergebnis der vorherigen Abfrage aktualisieren.Arbeiten mit Multilinien-Antworten in nachfolgenden Abfragen in einem Abfrageskript

Beispiel zu zeigen, was ich

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); 

So weit, so einfach bedeuten. Aber wie kann ich damit umgehen, wenn TABLE1 ein Multiline-Ergebnis liefert. Ich muss dies in einem myBatis "MIGRATE" -Skript machen; habe keine Programmunterstützung; einfach nur SQL. Diese Datenbank ist MySQL.

Antwort

0

Die einzige Art, wie ich noch sehen, ist eine gespeicherte Prozedur

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; 
zu verwenden
Verwandte Themen