2015-10-20 121 views
0

我的數據庫中有大約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很陌生,不知道自己做錯了什麼。 有沒有更有效的方法來做到這一點? 感謝您的支持!

回答

1
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'。 –

0

你應該更好地利用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'確實有效。您可以指定要更改的表格。 –