简体   繁体   中英

Updating a table joining another table

Update a table joining 1 more table.

UPDATE t1 SET  t1.col1 =1 FROM table1 t1 JOIN  table2 t2 
ON t1.ID=t2.ID
WHERE t1.Name='Test' AND t2.Age=25;

i get this error,You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM table1 t1 JOIN table2 t2 ...

Any thoughts?

Thanks.

There shouldn't be a FROM clause in the UPDATE statement, and the SET clause should follow the full set of table references:

UPDATE  table1 t1 
JOIN    table2 t2 ON t1.ID = t2.ID
SET     t1.col1 = 1
WHERE   t1.Name = 'Test' AND t2.Age = 25;

Test case:

CREATE TABLE table1 (id int, col1 int, name varchar(20));
CREATE TABLE table2 (id int, age int);

INSERT INTO table1 VALUES (1, 0, 'Test');
INSERT INTO table1 VALUES (2, 0, 'Test');
INSERT INTO table1 VALUES (3, 0, 'No Test');

INSERT INTO table2 VALUES (1, 20);
INSERT INTO table2 VALUES (2, 25);
INSERT INTO table2 VALUES (3, 25);

Result:

SELECT * FROM table1;
+------+------+---------+
| id   | col1 | name    |
+------+------+---------+
|    1 |    0 | Test    |
|    2 |    1 | Test    |
|    3 |    0 | No Test |
+------+------+---------+
3 rows in set (0.00 sec)
UPDATE  table1 SET  col1 = 1
from table1 t1
JOIN    table2 t2 ON t1.ID = t2.ID
WHERE   t1.Name = 'Test' AND t2.Age = 25;

I have a problem in update join. in table1 i saved username instead of userid. And for username datatype was varchar(10). When name exceeds 10 then name is saved with 10 character only. Now when i try to update using join query it doesn't works on those fields that have not exact unername in users table, Notice name bill gat in table1 but the name in users field was bill gates -es missing.

SELECT * FROM table1;
+------+------+---------+
| id   | col1 | created_by|
+------+------+---------+
|    1 |    0 | steve jobs|
|    2 |    1 | bill gat  |
|    3 |    0 | Jones   |
+------+------+---------+
3 rows in set (0.00 sec)

===I solved this way

    UPDATE table1 AS tr
JOIN users AS u ON u.name LIKE CONCAT('%', tr.created_by, '%')
SET tr.created_by=u.id
WHERE tr.created_by IS NOT NULL

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM