【问题标题】:SQL: How to update an empty column with pre-defined set of valuesSQL:如何使用预定义的一组值更新空列
【发布时间】:2015-05-07 14:23:32
【问题描述】:

我有一张表,比方说,有 100 条记录。该表有两列。第一列 (A) 具有唯一值。第二列 (B) 有 NULL 值

对于 A 列中的 4 个元素,我想关联一些之前定义的值,它们也是唯一的。

我不关心 B 列中的哪个值将与 A 列中的值相关联。我想将 4 个唯一值与另外 4 个唯一值相关联。基本上,就像我在 excel 中将一组值从一列剪切并粘贴到另一列一样。

不使用游标怎么办?

我想像现在一样对所有行使用一条 Update 语句,而不是对每一行使用一条 Update 语句。

【问题讨论】:

  • 你不能手动更新那些列吗?
  • 数字 100 和 4 用于表示问题。在现实世界中,该表有几百万行,要更新的块约为 300。
  • 现在你告诉我们?!显然,这会有所不同。你能安排你想“粘贴”到表格中的值吗?
  • @Zohar,我保持示例简单,抱歉误导。我想像现在一样对所有行使用一个更新语句,而不是对每一行使用一个更新语句
  • 您的预定义值是否已经在其他表中?您是否关心预定义的值是否在 ColumnA 中具有连续值?你用的是什么关系型数据库?

标签: sql


【解决方案1】:

试试这个:

UPDATE t
SET ColumnB = BValue
FROM Table t 
INNER JOIN
(
SELECT 1 AValue, 'Mouse' BValue UNION
SELECT 2, 'Cat' UNION
SELECT 3, 'Dog' UNION
SELECT 4, 'Wolf' 
) PreDefined ON(t.ColumnA = PreDefined.AValue)

在“预定义”表中使用您想要的任何数字,只要它们是唯一的并且在原始表的列 A 中的值范围内。

【讨论】:

    【解决方案2】:

    如果您只是出于测试目的尝试填写表格,我想您可以:

    A) 使用 A 列本身的值(因为它已经是唯一的)。

    B)如果它们不同,请在 A 列的值上使用一些函数来获得 B 列的值(一些简单的东西,比如 (ColumnA * 10),这会给你 A)

    C) 创建一个带有“字典”的临时表,为每个可能的 A 值设置一个 B 值,然后根据该字典表上的值查找表中所需的行。

    无论如何,如果您进一步解释您的目的,尝试向您提出解决方案会更容易。

    【讨论】:

      【解决方案3】:

      如果您的动物数据已经在数据库表中,那么您可以像这样使用单个更新语句:

      update target_table t4 
      set columnb = (
          select animal_name 
          from (select columna, animal_name 
                  from (select rownum rowNumber, animal_name from animal_table) t1
                      join (select rownum rowNumber, columna from target_table t1 where columnb is null) t2
                      on t1.rowNumber = t2.rowNumber
                  ) t3 
          where t4.columna = t3.columna
          )
      ;
      

      这是通过从源表中选择序列号和动物名称,然后从目标表中选择序列号和列值来实现的。通过在序列号上加入这些记录,您可以保证为每个 columna 值准确获得 1 个动物名称。然后,您可以将这些 columna-to-animal 记录加入您的目标表以更新 columnb。

      有关从另一个表中的值更新一个表的更多背景信息,您可以考虑此处提供的解决方案:Update rows in one table with data from another table based on one column in each being equal。唯一的区别是,在您的示例中,您的目标表和动物名称表之间没有任何匹配的列,因此您需要使用 rownum 创建任意一对一匹配的记录。

      如果您的唯一选项位于文本文件或电子表格中,那么您可以将它们格式化为固定宽度的空格填充字符串,然后使用 rownum 索引选择您想要的选项,如下所示:

      update table_name 
      set columnb = trim(substr('mouse cat   dog   wolf  ', rownum*6-6, 6)) 
      where columnb is null;
      

      【讨论】:

      • 现在我对要更新的每一行都使用一个更新语句(就像您在上面介绍的那样),我想对所有行使用一个更新语句
      • @user1146081 我已经使用 excel 或 regex 替换了我以前的答案,以便根据要求使用单个更新语句为每一行生成单独的更新语句。如果这符合您的需要,请接受答案。
      • @user1146081 我添加了一个具体示例,说明如何使用现有源表中的值更新目标表。
      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2017-06-04
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多