Because of this indeterminacy, referencing other tables only within sub-selects is safer, though often harder to read and slower than using a join.  Set the value of column C1 in table T to 1, only in those rows where the value of column C2 is "a".
UPDATE summary_data SET current_category = (SELECT category_id FROM products WHERE products.product_id = summary_data.product_id) WHERE EXISTS (SELECT category_id FROM products WHERE products.product_id = summary_data.product_id); If you want to test your skills using the SQL UPDATE statement, try some of our practice exercises.
Adding a WHERE clause would limit the result set of the JOINed table as well.
@Roger Ray what version of My SQL and what was your query, as this DOES infact function as stated. Col2)) UPDATE CTE SET Col1 = _Col1, Col2 = _Col2 statement on its own first to sanity check the results but it does requires you to alias the columns as above if they are named the same in source and target tables.
Any characters not found in this code page are lost.
DEFAULT Specifies that the default value defined for the column is to replace the existing value in the column.
If that is more important to you than performance you might prefer this answer, especially if your update is a one off to correct some data. My server wont allow FROM to be used in an UPDATE statement. This may be a niche reason to perform an update (for example, mainly used in a procedure), or may be obvious to others, but it should also be stated that you can perform an update-select statement without using join (in case the tables you're updating between have no common field).
UPDATE Table SET Table.col1 = other_table.col1, Table.col2 = other_table.col2 FROM Table INNER JOIN other_table ON = other_WHERE Table.col1 ! = other_table.col2 or (other_table.col1 is not null and table.col1 is null) or (other_table.col2 is not null and table.col2 is null) ; WITH CTE AS (SELECT T1. So all the answers involving the FROM clause returned a syntax error. UPDATE suppliers SET supplier_name = (SELECT FROM customers WHERE customers.customer_id = suppliers.supplier_id) WHERE EXISTS (SELECT FROM customers WHERE customers.customer_id = suppliers.supplier_id); UPDATE Table SET Table.col1 = other_table.col1, Table.col2 = other_table.col2 --select Table.col1, other_table.col, Table.col2,other_table.col2, * FROM Table INNER JOIN other_table ON = other_update t1 -- just reference table alias here set t1.somevalue = t2.somevalue from table1 t1 -- these rows will be the targets inner join table1 t2 -- these rows will be used as source on ..................
Sebastian covers a technique for this in a recent blog post: sqlity.net/en/2867/update-from-select This will tend to work across almost all DBMS which means learn once, execute everywhere. Col2 AS _Col2 FROM T1 JOIN T2 ON T1= T2/*Where clause added to exclude rows that are the same in both tables Handles NULL values correctly*/ WHERE EXISTS(SELECT T1. I know this is old, but just wanted to say this one worked for me.
In some databases, such as Postgre SQL, when a FROM clause is present, what essentially happens is that the target table is joined to the tables mentioned in the fromlist, and each output row of the join represents an update operation for the target table.
When using FROM, one should ensure that the join produces at most one output row for each row to be modified.
In other words, a target row shouldn't join to more than one row from the other table(s).
If it does, then only one of the join rows will be used to update the target row, but which one will be used is not readily predictable.