2012-07-23 58 views
1

我有一个表t1PRIMARY KEY,我会打电话ITEM_ID。 表如下:从JOIN更新列

ITEM_ID VALUE1 
2   2500 
3   3500 
5   5500 

我也有几个表t2t3是这样的:

ITEM_ID VALUE2 
2   250 
3   350 
4   450 
5   550 

ITEM_ID VALUE3 
2   25 
3   35 
4   45 
5   55 
6   65 

我要获得这个(我加盟保管只有在t1中找到的行)

ITEM_ID VALUE1 VALUE2 VALUE3 
2   2500  250  25 
3   3500  350  35 
5   5500  550  55 

我知道如何做到这一点,使用JOINCREATE一个新表。 但是仅仅通过ALTERADDUPDATE列可以做到吗?

+0

你是说修改,添加和更新列是什么意思?例如,最终的结果将在t1? – 2012-07-23 21:44:05

+0

是的,我的意思是更新表格t1,而不必进行JOIN并创建一个新表格。 – Youcha 2012-07-23 21:45:17

+0

你是否保证在两个子表中不会有重复的'ITEM_ID'?如果有的话会发生什么? – 2012-07-23 21:49:53

回答

7
ALTER TABLE t1 ADD VALUE2 INT, ADD VALUE3 INT; 

UPDATE t1 a 
JOIN t2 b ON a.ITEM_ID = b.ITEM_ID 
JOIN t3 c ON a.ITEM_ID = c.ITEM_ID 
SET a.VALUE2 = b.VALUE2, 
     a.VALUE3 = c.VALUE3; 
+1

sholudn't这是一个左连接?如果来自ty1的一个项目id存在于t2而不是t3,反之亦然 – 2012-07-23 21:47:40

2

您可以使用可能矫枉过正的存储过程,也可以执行两个查询。如果要执行第一个你JOIN,这是你必须要做的:

mysql> SELECT t1.ITEM_ID, t1.VALUE1, t2.VALUE2, t3.VALUE3 FROM t1 LEFT JOIN t2 ON t2.ITEM_ID = t1.ITEM_ID LEFT JOIN t3 ON t3.ITEM_ID = t1.ITEM_ID 
    -> ; 
+---------+--------+--------+--------+ 
| ITEM_ID | VALUE1 | VALUE2 | VALUE3 | 
+---------+--------+--------+--------+ 
|  2 | 2500 | 250 | 25  | 
|  3 | 3500 | 350 | 35  | 
|  5 | 5500 | 550 | 55  | 
+---------+--------+--------+--------+ 
3 rows in set (0.00 sec) 

mysql> 

接下来,如果你想创建这些值的新表,那么你可以这样做:

CREATE TABLE my_temp_table (SELECT t1.ITEM_ID, t1.VALUE1, t2.VALUE2, t3.VALUE3 FROM t1 LEFT JOIN t2 ON t2.ITEM_ID = t1.ITEM_ID LEFT JOIN t3 ON t3.ITEM_ID = t1.ITEM_ID); 

如果您想对数据进行更新,使用原来的加入,但转换为UPDATE代替:

UPDATE t1 LEFT JOIN t2 ON t2.ITEM_ID = t1.ITEM_ID LEFT JOIN t3 ON t3.ITEM_ID = t1.ITEM_ID SET t1.VALUE1 = 'someValue' WHERE t1.ITEM_ID = 'someId'; 

这里积聚了测试:

mysql> CREATE TABLE t1 (ITEM_ID INT NOT NULL AUTO_INCREMENT, VALUE1 VARCHAR(24) NOT NULL, PRIMARY KEY (ITEM_ID)); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO t1 VALUES (2, 2500), (3, 3500), (5, 5500); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> CREATE TABLE t2 (ITEM_ID INT NOT NULL AUTO_INCREMENT, VALUE2 VARCHAR(24) NOT NULL, PRIMARY KEY (ITEM_ID)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE t3 (ITEM_ID INT NOT NULL AUTO_INCREMENT, VALUE3 VARCHAR(24) NOT NULL, PRIMARY KEY (ITEM_ID)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO t2 VALUES (2, 250), (3, 350), (4, 450), (5, 550); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO t3 VALUES (2, 25), (3, 35), (4, 45), (5, 55), (6, 65); 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 
+0

t1和t2之间的连接也应该是左连接 – 2012-07-23 21:52:48