sql >> Database >  >> RDS >> Mysql

MySQL foreach-lus

Van wat ik kan verzamelen, zou het volgende moeten volstaan, zolang de velden zijn wat je hebt opgegeven.

INSERT INTO Address (email)
  SELECT User.email
    FROM User JOIN person ON User.id_person = person.id
   WHERE person.id_address IS NULL
;

BEWERKEN (met cursor)

Dit zou vrij eenvoudig moeten zijn met een cursor, maar ik raad u ten zeerste aan om uzelf vertrouwd te maken met deze en de implicaties.

DROP PROCEDURE IF EXISTS _tmp_update_address;
DELIMITER $$
CREATE PROCEDURE _tmp_update_address()
BEGIN
   DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE;
   DECLARE cur_userId, cur_personId INT;
   DECLARE cur_email VARCHAR(250) DEFAULT '';

   DECLARE cursor_List CURSOR FOR 
      SELECT User.id, person.id_address, User.email
      FROM User JOIN person ON User.id_person = person.id
      WHERE person.id_address IS NULL
    ;

   DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE;

   OPEN cursor_List;

   loop_List: LOOP
      FETCH cursor_List INTO cur_userId, cur_personId, cur_email;
      IF cursor_List_isdone THEN
         LEAVE loop_List;
      END IF;

      INSERT INTO Address (email) VALUES (cur_email);
      UPDATE person SET person.id_address = LAST_INSERT_ID()
         WHERE person.id = cur_personId;

   END LOOP loop_List;

   CLOSE cursor_List;
END

$$

DELIMITER ;

CALL _tmp_update_address();


  1. ORA-01799:een kolom mag niet worden toegevoegd aan een subquery

  2. mysql-transactie - terugdraaien op elke uitzondering

  3. Een SQL-query schrijven om een ​​item uit de volgende tabel te SELECTEREN

  4. Traceervlag 2389 en de nieuwe kardinaliteitsschatter