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