【问题标题】:Inserting multiple rows of data into a single column将多行数据插入单个列
【发布时间】:2021-11-19 12:24:02
【问题描述】:

这里是绝对的 SQL 初学者:

我有一个表“学生”,其中包含“id”(主键)、“名称”和“标记”列。

我现在正在尝试为一些学生添加分数。只需使用多个 UPDATE 语句,例如

    UPDATE students SET mark = 4.1 WHERE id = 1;
    UPDATE students SET mark = 1.8 WHERE id = 2;
    UPDATE students SET mark = 2.7 WHERE id = 3;
    UPDATE students SET mark = 3.5 WHERE id = 4;
    ...and so on

似乎相当乏味和劳动密集型。使用 MS SQL 执行此类操作的最简单、最优雅的方法是什么?

【问题讨论】:

  • mark 的值从何而来?
  • 您添加的是行,而不是列。但更大的问题是您的架构有缺陷。 “分数”不是学生的直接属性。相反,它们是学生在特定时间学习特定课程的属性。
  • 如果您的数据在 excel 表中,您可以使用如下公式轻松编写代码:[="UPDATE students SET mark = "&B1&" WHERE id = "&A1&";" ]。 “A”列代表您的 ID,“B”列代表标记。然后复制/粘贴你的 sql

标签: sql sql-server sql-update


【解决方案1】:

首先我想说你的代码完全没问题。也就是说,在我看来,这可能会更漂亮一点:

UPDATE students SET mark = CASE id
    WHEN 1 THEN 4.1
    WHEN 2 THEN 1.8
    WHEN 3 THEN 2.7
    WHEN 4 THEN 3.5
END;

但同样没有必要让它比你做的更复杂。 SQL 更多的是关于编写快速准确的代码,而不是让它变得漂亮。

另外,欢迎使用 Stack Overflow!

【讨论】:

    【解决方案2】:

    创建一个新的temp table,并将所有值插入到一个表中:

    INSERT INTO grades (id, mark) VALUES ( 1, 4.1);
    INSERT INTO grades (id, mark) VALUES ( 2, 1.8);
    ...
    

    现在你可以简单地加入

    UPDATE students
           JOIN grades
           ON students.id = grades.id
    SET students.mark = grades.mark;
    

    这里的好处是,除了建立一个新的成绩表,你的更新语句不会改变。

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2011-06-14
      • 1970-01-01
      • 2012-03-16
      • 2022-06-11
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多