更新Access中的查询以将MANY列从Null更新为value

时间:2017-08-17 18:36:13

标签: sql ms-access

我有一个大约有100列的数据库表(笨重,我知道)。我有大约一半的这些列,我需要迭代更新以设置Is Null或""值为" TBD"。

我将所有50个需要更新的列编译成一个更新查询,其中的Access SQL代码看起来像这样......

UPDATE tablename
SET tablename.column1="TBD", tablename.column2="TBD", tablename.column3="TBD"....
WHERE tablename.column1 Is Null OR tablename.column1="" OR tablename.column2 Is Null OR tablename.column2="" OR tablename.column3 Is Null OR tablename.column3=""....

两个问题:这个包含50列的查询收到一个"查询过于复杂"错误。

此查询在功能上也是错误的...因为我在WHERE语句中丢失了这些列中的数据。由于OR子句,正在更新具有我不想更新的值的记录。

我的问题是如何更新所有这些列并将其null或空值设置为特定值(在本例中为&#34; TBD&#34;)? < / p>

我知道我可以使用选择查询来选择我需要更新的列,运行它,只需要CTRL + H来查找&amp;替换&#34;&#34; to&#34; TBD&#34;。但是,我担心这可能会在我的数据集中引入错误。我也知道我也可以逐列检查并通过更新查询更新这些值。但是,使用50+列并且这将非常耗时。我需要在整个数据集上运行的迭代更新。

我倾向于后一条路线。我仍然想知道是否有任何其他脚本选项,我可以构建一个查询来克服这样的问题,这导致我在这里。

谢谢!

2 个答案:

答案 0 :(得分:3)

你可以运行50个查询:

UPDATE table SET column1="TBD" WHERE column1 IS NULL OR column1 = "";

优化可能是:

  • 创建一个临时表,确定哪些行实际需要更新:连接所有列值,以便单个NULL或空将导致临时表中的记录。这样,您只需扫描基表一次。
  • 使用该表中的键仅关注这些行。

等。 这是安全的,只会更新您的空值(前一个查询将更新所有列,除非您先使用IFNULL检查每个值)。 此查询样式也不会遇到过于复杂的问题

答案 1 :(得分:0)

您可以发出一个查询:

UPDATE tablename
    SET column1 = iif(column1 is null or column1 = "", "TBD", column1),
        column2 = iif(column2 is null or column2 = "", "TBD", column2),
        . . .;

如果您不介意可能更新所有行,则可以省略where子句。