【问题标题】:SQL Query to copy data from one table into multiple other tablesSQL 查询将数据从一个表复制到多个其他表
【发布时间】:2015-12-28 20:09:32
【问题描述】:

我正在寻找一张包含信息的表格,并将该信息复制到其他多个表格中。

例如,我将使用一所学校。学校有一张桌子,上面有所有学生的名册、他们的学生证、他们开始上学的时间、学年结束的时间、每个班级的成绩、他们的地址、电话号码等。所有这些都在一个名为 School 的表中.AllStudentInfo.

我想做的是获取所有这些数据,然后用这些信息填充其他一些表格,例如:

  • School.Students - 这将填充来自原始 School.AllStudentInfo 的所有非重复学生 ID,以及特定信息(家庭住址、年龄、年级等) .

  • School.Classes - 我想用 School.AllStudentInfo 表中列出的所有班级 Id 填充它(忽略重复项)。

  • Classes.Students - 我想用与 School.Classes 的 PK 有关系的 ClassId (Classes.Students.ClassId) 填充这个“桥/链接表” (School.Classes.Id)。它还将与与 Schools.Students.Id 列相关的 StudentId (Classes.Students.StudentId) 有关系。

但是,我不知道如何一次更新多个表和多个列,并且还没有找到是否真的可以这样做。

是吗?如果是这样,怎么做?

因此,表列是:

School.Students
---------------
StudentId (int)

School.Classes
---------------
ClassId (int)

Classes.Students
---------------
ID (int)
Student (int)
Class (int)

【问题讨论】:

    标签: sql database


    【解决方案1】:

    您必须编写多个语句,您不能在一个语句中处理多个表。好消息是,这仍然没什么大不了的。

    首先填写studentsclasses 表格。类似的东西

    INSERT INTO students
    SELECT DISTINCT student_name, date_of_birth, whatever
    FROM your_huge_denormalized_table;
    

    classes 表的情况相同。使用 auto_increment 列(作为主键)来获取您的 ID 列。

    在旁注中,不要使用名称中带有点的表名。通常它就像databasename.tablename。你明白了……

    现在您已经填写了两个表,请填写解决 m:n 关系的表。哦,这里不需要ID列,只需要主键(student, class)即可。

    INSERT INTO classes_students
    SELECT DISTINCT s.ID, c.ID
    FROM your_huge_denormalized_table d
    INNER JOIN students s ON d.StudentName = s.StudentName AND d.dob = s.dob /*add as much columns as needed to really identify each student*/
    INNER JOIN classes c ON d.class_name = c.class_name;
    

    就是这样。

    【讨论】:

    • fancyPants,非常感谢您的回复!我不知道我不能在一个语句中处理多个表,所以难怪它不起作用;-) 既然你提出来了,schema.tablename 是不是一个不好的表命名约定?通常它是 dbo.tablename(在 SQl 2008 中,我在这方面相对较新),但我为我需要的各种类型的表创建了模式。这样做的全部目的是因为每月一次,我得到一个从 excel 表导入的巨大的非规范化表,然后必须将其分成相关的表......非常烦人。干杯!
    • 在 SQL Server 中是 schemaname.dbo.tablename,是的(dbo 表示数据库对象)。我只是建议不要在表名中使用点,除非您每次都想在表名周围写 []。为什么要将表放在不同的模式中?
    • 我的工作是一名Web开发人员II(我会是I,但有以前的编程经验),但我对SQL Server的经验很少。有人告诉我,我需要创建一个模式以便在逻辑上为我们的应用程序分离表。使用我之前的示例,我们将拥有类似于 Classes.Students、Classes.Teachers 的内容,然后将用户 ID 桥接到 Schools.Classes。 Schools.Locations 将保存学校的位置列表等。诸如 Security.Roles、Security.Permissions 等。我仍在学习,但我认为这确实是唯一的原因。不好吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多