我基本上有一个包含3000万条记录的表A,我想在表格中添加一个名为“TYPE”的列。我有一个查找表B,将代码映射到一个颜色。我想迭代表A并将表A中的代码与表B中的代码进行比较,然后将颜色添加到表A中的TYPE列。这可能吗?解决这个问题的最佳方法是什么?表B中的代码与表A中的实际代码不完全匹配。
答案 0 :(得分:0)
提出或解决事务大小问题,是不是添加列的简单ALTER TABLE和修复它的UPDATE?
ALTER TABLE TableA ADD (Type VARCHAR(10));
UPDATE TableA
SET Type = ((SELECT Colour FROM TableB WHERE TableA.Type = TableB.Type));
唯一棘手的一点可能是双括号;在某些DBMS中需要它们,而在其他DBMS中可能不需要它们(单个括号可能就足够了)。您也可以使用带有JOIN的UPDATE;那里的语法也不完全是标准的。
请注意,此映射依赖于将NULL更改为NULL为无操作。如果某些行中有值,但并非所有这些行都与TableB中的条目匹配,那么您需要注意像这样的全表UPDATE。它会将TableA中与TableB中没有匹配的任何行的Type设置为NULL。如果那不是您所需要的,您可以使用带有JOIN的UPDATE或者您写的:
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子句没有任何损害。
答案 1 :(得分:0)
很难说没有看到架构或知道DBMS但是,如果它始终是用于查找颜色的代码的前2位数,为什么不
UPDATE table_a SET type = SUBSTR(code, 2)
并正常加入
你可以像
那样进行联接JOIN table_b ON table_b.id = SUBSTR(table_a.code,2)
但这很难表现出来。
答案 2 :(得分: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很小,那么性能可能是可以接受的。