【问题标题】:Inserting multiple values in junction table在联结表中插入多个值
【发布时间】:2022-01-21 19:26:49
【问题描述】:

我有一个主表:

ID  first_name last_name  designation
--------------------------------------------------------
1       A1       Z1         Student
2       A2       Z2         HOD,Professor 
3       A3       Z3         Professor

我创建了另外 2 个表(名称和名称)以满足 1NF。

名称表:

ID  first_name last_name
-------------------------
n_1   A1         Z1
n_2   A2         Z2
n_3   A3         Z3

代号表:

designation_code  designation
-----------------------------
D_101             Student
D_102             HOD
D_103             Professor

由于包含两个表的主键的多对多关系,我创建了一个联结表。目前我的联结表是空的。

名称指定表:

ID   designation_code
----------------------

我知道我们可以手动插入记录,但我在两个表中都有 1000 条记录。如何使用 INSERT 查询一次性在联结表中插入数百万条记录,使最终结果看起来像这样?

名称指定表:

ID   designation_code
----------------------
n_1     D_101
n_2     D_102
n_2     D_103
n_3     D_103

【问题讨论】:

  • 你到底想做什么?您想在namedesignation 表中创建随机行吗?
  • 目前,我无法对名称和指定表执行 JOIN 操作。这些表都没有外键。因此,我想在这两个表之间建立关系
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql sql-insert junction-table


【解决方案1】:
insert into name_designation_table
select
    n.ID,
    d.designation_code
from
    main_table m
    inner join name_table n on n.first_name = m.first_name and n.last_name = m.last_name  
    inner join designation_table d on d.designation = m.designation 

但是这种方法有一个缺陷——first_namelast_name 值的组合在您的 main_table 中可能不是唯一的。可以有多个人的名字和姓氏相同。您必须找到更多列来唯一标识一个人,例如出生日期或社会安全号码。

【讨论】:

    【解决方案2】:

    在现代版本的 SQL Server 中,您可以为此使用 CROSS APPLY STRING_SPLIT

    INSERT name_designation (ID, designation_code)
    SELECT m.ID, d.designation_code
    FROM main m
    CROSS APPLY STRING_SPLIT(m.designation, ',') s
    JOIN designation d on d.designation = s.value;
    

    然后您可以删除main,因为所有信息现在都存储在其他三个表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多