0

多対多の関係テーブルのデータをコピーして、3番目のテーブルを作成しています。ストアドプロシージャは現在次のようになっていますが、エラーがあります

DELIMITER $$ 
CREATE PROCEDURE `test`.UpdateRelatedAccounts() 
BEGIN 
    DECLARE ssn_sel_id VARCHAR(255) DEFAULT 0;
    DECLARE id_sel_id CHAR(36) DEFAULT 0;
    DECLARE id_sel_rel CHAR(36) DEFAULT 0;
    DECLARE no_more_rows BOOLEAN;
    DECLARE num_rows INT DEFAULT 0;
    DECLARE no_more_rel_rows BOOLEAN;
    DECLARE rel_num_rows INT DEFAULT 0;

  DECLARE ssn_all_cur CURSOR FOR
   SELECT ssn, id FROM ssn WHERE ssn NOT IN ('','000-00-0000');

  DECLARE ssn_cur CURSOR FOR
   SELECT id FROM ssn WHERE id != id_sel_id AND ssn = ssn_sel_id;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
 -- DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rel_rows = TRUE;



 OPEN ssn_all_cur;
 SELECT FOUND_ROWS() INTO num_rows;
    the_loop: LOOP
        FETCH  ssn_all_cur
        INTO ssn_sel_id, id_sel_id;

        IF no_more_rows THEN
        CLOSE ssn_all_cur;
        LEAVE the_loop;
        END IF;



    OPEN ssn_cur;
    SELECT FOUND_ROWS() INTO rel_num_rows;
    the_rel_loop: LOOP
        FETCH  ssn_cur
        INTO id_sel_rel;

        IF no_more_rel_rows THEN
        CLOSE ssn_cur;
        LEAVE the_rel_loop;
        END IF;

      INSERT INTO `ssn_related` ( `ssn_primary`, `ssn_related` ) VALUES ( id_sel_id, id_sel_rel ), ( id_sel_rel, id_sel_id ); 

     END LOOP the_rel_loop;

  END LOOP the_loop;    
END$$ 
DELIMITER ; 

値を使用して3番目のテーブルに挿入するにはどうすればよいですか。

4

1 に答える 1

3

カーソルは遅く、ほとんどの場合不要です。ネストされたカーソルは低速²で不要²です。カーソルは、他に方法がない場合にのみ、最後の手段として使用されます。

あなたがしたいことはこれに分解することができます:

INSERT INTO `ssn_related` ( `ssn_primary`, `ssn_related` )
SELECT
ssn_1.id,
ssn_2.id
FROM
ssn ssn_1
INNER JOIN ssn ssn_2 ON ssn_2.ssn = ssn_1.id
WHERE ssn_1.ssn NOT IN ('', '000-00-0000')
AND ssn_2.id != ssn_1.id;

次に、SELECTのスワップされた列で同じことを繰り返します。

INSERT INTO `ssn_related` ( `ssn_primary`, `ssn_related` )
SELECT
ssn_2.id,
ssn_1.id
FROM
ssn ssn_1
INNER JOIN ssn ssn_2 ON ssn_2.ssn = ssn_1.id
WHERE ssn_1.ssn NOT IN ('', '000-00-0000')
AND ssn_2.id != ssn_1.id;
于 2013-02-21T14:31:28.690 に答える