【问题标题】:Inserting data to multiple table with selecting from another table将数据插入多个表并从另一个表中进行选择
【发布时间】:2015-08-20 14:52:24
【问题描述】:

我有 3 个表,想在前 2 个表上插入记录 table3 上的记录数。

表 2 中的我的 Table1_ID 列与 table1 ID 链接。

table3 有 8 条记录,所以需要在里面插入这 8 条记录 table2 名称列,同时我需要向 table1 插入数据。 在表 1 中,如果您注意到位置以 0 开头,字段 ID 为 50 结果表

table1

|ID|FieldID|Position|
|0 |   0   |   0    |
|1 |   15  |   1    |
|2 |   15  |   2    |

table2

|ID|Table1_ID|  Y/N   | Name |
|0 |   0     |   1    | N1   |
|1 |   1     |   1    | N2   |
|2 |   2     |   1    | N3   |

table3

|ID| Name | 
|1 |      |
|2 | N4   |
|3 | N5   | 
|4 | N6   |
|5 | N7   |
|6 | N8   | 
|7 | N9   |
|8 | N10  |
|9 | N11  |

结果

table1

|ID|FieldID|Position|
|0 |   0   |   0    |
|1 |   15  |   0    |
|2 |   15  |   1    |
|3 |   50  |   0    |
|4 |   50  |   1    |
|5 |   50  |   2    |
|6 |   50  |   3    |
|7 |   50  |   4    |
|8 |   50  |   5    |
|9 |   50  |   6    |
|10|   50  |   7    |

table2

|ID|Table1_ID|  Y/N   | Name |
|0 |   0     |   1    | N1   |
|1 |   1     |   1    | N2   |
|2 |   2     |   1    | N3   |
|3 |   3     |   1    | N4   |
|4 |   4     |   1    | N5   |
|5 |   5     |   1    | N6   |
|6 |   6     |   1    | N7   |
|7 |   7     |   1    | N8   |
|8 |   8     |   1    | N9   |
|9 |   9     |   1    | N10  |
|10|   10    |   1    | N11  |

【问题讨论】:

  • 我怎么知道FieldID 是50?我在您的 table3 中没有看到任何地方。
  • 这 50 个是手动来的。没有进入任何其他表。需要用静态值 50 填充 table1。
  • 据我所知,您这里有一个设计问题,而不是其他任何问题。在进一步移动之前,您可能需要考虑重新设计表结构。

标签: sql sql-server-2012


【解决方案1】:

如果我正确理解问题是如何同时插入两个表,那么:

1) 打开一个事务,执行两次插入,然后提交数据更改。就任何其他会话而言,这两个表都将一起更新。

2) 在 sql-server 中使用 OUTPUT 选项。在插入 table2 时,添加 OUTPUT 选项以将数据插入 table1。见链接https://msdn.microsoft.com/en-us/library/ms177564.aspx

【讨论】:

    【解决方案2】:

    这绝对不是获得所需输出的最佳方法,但您可以这样做 (NOT RECOMMENDED):

    创建表格:

    create table table1 (ID int identity(0,1), 
                         FieldID int, 
                         Position int
                   CONSTRAINT pk_table1_id PRIMARY KEY(ID));
    
    insert into table1 values
    (0 ,0),
    (15,1),
    (15,2);
    
    create table table2 (ID int identity(0,1), 
                         Table1_ID int,  
                         Y_N  int, 
                         Name varchar(50) 
                  CONSTRAINT fk_table1_pid FOREIGN KEY(Table1_ID)REFERENCES table1(ID));
    
    insert into table2 values
    (0, 1, 'N1'),
    (1, 1, 'N2'),
    (2, 1, 'N3');
    
    create table table3 (ID int, Name varchar(50));
    
    insert into table3 values
    (1,  null),  
    (2, 'N4'),
    (3, 'N5'), 
    (4, 'N6'),
    (5, 'N7'),
    (6, 'N8'), 
    (7, 'N9'),
    (8, 'N10'),
    (9, 'N11');
    
    
    insert into table1 (FieldID,Position)
    select 50 as FieldID,
           1 as Position
    from table3
    where name is not null;
    
    insert into table2 (Table1_ID,Y_N,Name)
    select [id] + 1 as Table1_ID,
           1 as Y_N,
           Name
    from table3
    where name is not null;
    

    更新表 1 中的位置:

    UPDATE t
    SET position = t1.rn
    FROM table1 t
    INNER JOIN (
        SELECT  id,
                row_number() OVER (
                PARTITION BY FieldID ORDER BY ID
                ) - 1 AS rn
        FROM table1 
        ) t1 ON t.id = t1.id;
    

    从表格中选择:

    select * from table1;
    
    select * from table2;
    

    结果:

    表 1

    +----+---------+----------+
    | ID | FieldID | Position |
    +----+---------+----------+
    |  0 |       0 |        0 |
    |  1 |      15 |        0 |
    |  2 |      15 |        1 |
    |  3 |      50 |        0 |
    |  4 |      50 |        1 |
    |  5 |      50 |        2 |
    |  6 |      50 |        3 |
    |  7 |      50 |        4 |
    |  8 |      50 |        5 |
    |  9 |      50 |        6 |
    | 10 |      50 |        7 |
    +----+---------+----------+
    

    表2

    +----+-----------+-----+------+
    | ID | Table1_ID | Y_N | Name |
    +----+-----------+-----+------+
    |  0 |         0 |   1 | N1   |
    |  1 |         1 |   1 | N2   |
    |  2 |         2 |   1 | N3   |
    |  3 |         3 |   1 | N4   |
    |  4 |         4 |   1 | N5   |
    |  5 |         5 |   1 | N6   |
    |  6 |         6 |   1 | N7   |
    |  7 |         7 |   1 | N8   |
    |  8 |         8 |   1 | N9   |
    |  9 |         9 |   1 | N10  |
    | 10 |        10 |   1 | N11  |
    +----+-----------+-----+------+
    

    SQL Fiddle Demo

    同样,这适用于上面的输出,但这里有太多的设计缺陷。因此,帖子更新的原因和所有额外的东西。希望您可以重新设计表结构,以避免所有麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2013-03-04
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多