在SQL中查找表

时间:2012-05-25 21:19:32

标签: sql

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

3 个答案:

答案 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很小,那么性能可能是可以接受的。