0

我基本上有一个包含 3000 万条记录的表 A,我想在表中添加一个名为“TYPE”的列。我有一个将代码映射到颜色的查找表 B。我想遍历表 A 并将表 A 中的代码与表 B 中的代码进行比较,然后将颜色添加到表 A 中的 TYPE 列。这可能吗?解决这个问题的最佳方法是什么?表 B 中的代码与表 A 中的实际代码不完全匹配。

4

3 回答 3

0

给出或接受事务大小的问题,添加列和更新来修复它不是一个简单的 ALTER TABLE 吗?

ALTER TABLE TableA ADD (Type VARCHAR(10));

UPDATE TableA
   SET Type = ((SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type));

唯一棘手的可能是双括号;它们在某些 DBMS 中是必需的,而在其他 DBMS 中可能不需要(单括号可能就足够了)。您还可以使用 UPDATE 和 JOIN;那里的语法也不完全标准。

请注意,此映射依赖于将 NULL 更改为 NULL 是无操作的。如果您在某些行中有值,但并非所有这些行都与 TableB 中的条目匹配,那么您需要小心使用这样的全表 UPDATE。它将 TableA 中任何与 TableB 中不匹配的行的 Type 设置为 NULL。如果这不是您所需要的,您可以使用 UPDATE 和 JOIN 或编写:

UPDATE TableA
   SET Type = ((SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type));
 WHERE Type IN (SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type);

在当前情况下,列是新添加的,因此无论如何都包含 NULL,省略 UPDATE 本身的 WHERE 子句并没有什么坏处。

于 2012-05-25T21:31:20.177 回答
0

很难说没有看到架构或不知道 DBMS,但是,如果它总是用于查找颜色的代码的前 2 位,为什么不

UPDATE table_a SET type = SUBSTR(code, 2)

并正常进行 JOIN

你可以加入

JOIN table_b ON table_b.id = SUBSTR(table_a.code,2)

但这几乎不会有效。

于 2012-05-25T21:33:50.993 回答
0

您可以通过查看表 B 中代码的第一个字符来进行更新,如以下语句所示:

update table_a
    set table_a.type = table_b.type
    from table_b
    where table_b.code = substr(table_a.code, 1, length(table_b.code))

这可能有点慢,因为您不能使用任何索引来加速它。但是,如果 table_b 很小,那么性能可能是可以接受的。

于 2012-05-26T02:03:47.740 回答