将数据有选择地从一个表拆分并保存到另一个表

时间:2013-07-29 17:02:27

标签: php mysql sql triggers union

有选择地拆分数据

我有一个包含以下字段的表

表1

Publication_ID, Student_ID, Q1,A1,Q2,A2,Q3,A3,Q4,A4......................Q249,A249,Q250,A250

示例数据

100, 123, 1, B, 2, A, 3, C,4, B, 5, D, 6, B,..........................120, C
100, 124, 1, C, 2, C, 3, D,4, C, 5, D, 6, B,.....................109, B
100, 125, 1, B, 2, C, 3, C,4, B, 5, D, 6, A,..........................120, C
100, 126, 1, C, 2, B, 3, A,4, B, 5, C, 6, D,..............................................250, D

现在我想将表格上方的数据保存到此格式的另一个表格

表2

Publication_ID, Student_ID, Q,A
100, 123, 1,B
100, 123, 2,A
100, 123, 3,C
100, 123, 4,B
100, 123, 5,D
100, 123, 6,B
100, 124, 2,A
100, 124, 3,C
100, 124, 4,B
100, 124, 5,D
100, 124, 6,B
100, 125, 1,B
100, 125, 2,A
100, 125, 3,C
100, 125, 4,B
100, 125, 5,D
100, 125, 6,B


请注意,表1中填写的字段数可能与所有数据行不同。所以它不应该将空字段插入表-1中的表-2

请在这方面帮助我

2 个答案:

答案 0 :(得分:1)

INSERT INTO table-2(SELECT Publication_ID,Student_ID,Q1,Q2,....A1,A2... FROM table-1)

如果我理解正确

答案 1 :(得分:0)

我假设您正在尝试规范化某种表格。因此,为了实现期望的结果,执行多个数据操作语句不应该是一个问题。这样的事情可能会成功:

SET autocommit = 0

-- repeat for n for 1 to 249
INSERT INTO T2
  SELECT Publication_ID, Student_ID, Qn, An WHERE Qn IS NOT NULL

COMMIT

如果您确实需要在不使用宿主语言的情况下执行迁移,则可以使用以下过程:

CREATE PROCEDURE migrate()
BEGIN
  DELETE FROM T2;
  SET @n = 1;
  REPEAT
    SET @p = CONCAT('INSERT INTO T2 SELECT Publication_ID, Student_ID, Q', @n, ' as Q A', @n, ' WHERE Q IS NOT NULL');
    PREPARE stmt FROM @p;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    SET @n = @n+1;
  UNTIL @n > 249
  END REPEAT;
END //

CALL migrate()