Mysql:使用来自多个列的值更新一列的值

问题描述:

我的数据库中有大约12个表格,列数很多。我想从他们那里挑选我需要的信息,并将其放入具有预定义结构的新表中。所有表都有一个唯一的标识符“ID”。Mysql:使用来自多个列的值更新一列的值

newtable的结构:

ID |苹果|香蕉|黄瓜|日期

table1的结构

ID | chiquita | grannysmith | IDontWanthis | OrThis

使用:

UPDATE newtable SET bananas = (SELECT chiquita FROM table1 
           WHERE newtable.ID = table1.ID) 

我有困难,但是当更多的列可包含的一条信息,我需要填写新列。

我想:

UPDATE newtable SET apples = (SELECT grannysmith FROM table1 
           WHERE newtable.ID = table1.ID) 

,然后一个新的更新:

UPDATE newtable SET apples = (SELECT elstar FROM table2 
           WHERE newtable.ID = table2.ID 
           AND newtable.apples IS NULL) 

然而,取代在table2.elstar,不仅NULL值newtable.apples所有的值。先前填入的值现在为NULL。

我对SQL很陌生,不知道自己做错了什么。 有没有更有效的方法来做到这一点? 感谢您的支持!

UPDATE newtable SET apples = (SELECT elstar FROM table2 
          WHERE newtable.ID = table2.ID 
          AND newtable.apples IS NULL) 
WHERE apples IS NULL 

你需要一个where子句中的外部查询来过滤apples is null为好。

+0

谢谢,这是诀窍!你能否详细说明一下?第二个“WHERE”背后的逻辑是什么? – zufanka

+0

原因是,外部查询不知道哪些行要更新与'where'条件。因此你必须在外部查询中指定'where'。 –

你应该更好地利用JOIN

http://sqlfiddle.com/#!9/f3dda/1

UPDATE newtable n 
INNER JOIN table1 t 
ON n.id = t.id 
SET n.bananas = t.chiquita, n.apples = t.grannysmith 

,如果你想避免newtable覆盖旧值可以改变ON条款,如:

UPDATE newtable n 
INNER JOIN table1 t 
ON n.id = t.id AND (n.bananas IS NULL OR n.apples IS NULL) 
SET n.bananas = t.chiquita, n.apples = t.grannysmith 

UPDATE即使你只想更新一个c olumn每次JOIN是从性能角度来看是更可取的方法:

UPDATE newtable n 
INNER JOIN table1 t 
ON n.id = t.id AND n.bananas IS NULL 
SET n.bananas = t.chiquita 
+0

如果我需要更新多个表中的一列(=执行多个连接),这不起作用。最后一张桌子将重新编写剩下的桌子。 – zufanka

+0

多个'JOINs'确实有效。您可以指定要更改的表格。 –