Details
-
Technical task
-
Status: Open (View Workflow)
-
Major
-
Resolution: Unresolved
-
None
-
None
Description
Implement Oracle-style multi-table UPDATE syntax:
UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; |
Example:
DROP TABLE t1; |
DROP TABLE t2; |
CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); |
INSERT INTO t1 VALUES (1, 100); |
INSERT INTO t1 VALUES (2, 100); |
CREATE TABLE t2 (id INT, p2 INT); |
INSERT INTO t2 VALUES (1, 10); |
INSERT INTO t2 VALUES (1, 20); |
UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; |
SELECT * FROM t2; |
ID P2
|
---------- ----------
|
1 11
|
1 21
|
Note, Oracle has some limitations. If I rewrite the above UPDATE statement as:
UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p1=p1+1; |
it returns an error:
UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p1=p1+1
|
*
|
ERROR at line 1:
|
ORA-01779: cannot modify a column which maps to a non key-preserved table
|
Attachments
Activity
Field | Original Value | New Value |
---|---|---|
Description |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=10) SET p2=p2+10; SELECT * FROM t2; {code} |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+10; SELECT * FROM t2; {code} |
Description |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+10; SELECT * FROM t2; {code} |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} |
Description |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} {noformat} ID P2 ---------- ---------- 1 11 1 21 {noformat} |
Description |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} {noformat} ID P2 ---------- ---------- 1 11 1 21 {noformat} |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} Example: {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} {noformat} ID P2 ---------- ---------- 1 11 1 21 {noformat} |
Description |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} Example: {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} {noformat} ID P2 ---------- ---------- 1 11 1 21 {noformat} |
Implement Oracle-style multi-table {{UPDATE}} syntax:
{code:sql} UPDATE (SELECT ... FROM t1,t2 WHERE ... ) SET ...; {code} Example: {code:sql} DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1 (id INT PRIMARY KEY, p1 INT); INSERT INTO t1 VALUES (1, 100); INSERT INTO t1 VALUES (2, 100); CREATE TABLE t2 (id INT, p2 INT); INSERT INTO t2 VALUES (1, 10); INSERT INTO t2 VALUES (1, 20); UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p2=p2+1; SELECT * FROM t2; {code} {noformat} ID P2 ---------- ---------- 1 11 1 21 {noformat} Note, Oracle has some limitations. If I rewrite the above {{UPDATE}} statement as: {code:sql} UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p1=p1+1; {code} it returns an error: {noformat} UPDATE (SELECT p1,p2 FROM t1,t2 WHERE t1.id=t2.id AND p1=100) SET p1=p1+1 * ERROR at line 1: ORA-01779: cannot modify a column which maps to a non key-preserved table {noformat} |
Parent |
|
|
Issue Type | Task [ 3 ] | Technical task [ 7 ] |
Labels | Compatibility |
Labels | Compatibility |
Labels | Compatibility |
Labels | Compatibility |
Labels | Compatibility |
Labels | Compatibility | Compatibility NRE-307517 |
NRE Projects | NRE-307517 |
Labels | Compatibility NRE-307517 | Compatibility |
Fix Version/s | 10.3 [ 22126 ] | |
Fix Version/s | 10.2 [ 14601 ] |
Comment | [ Should it have 10.2 as a fix version? ] |
Parent |
|
MDEV-10764 [ 57940 ] |
Fix Version/s | 10.3 [ 22126 ] |
Support case ID | not-26307 |
NRE Projects | AC-2610/DEFERRED |
Workflow | MariaDB v3 [ 76678 ] | MariaDB v4 [ 140036 ] |
This looks like something that can be done only at the parser level where we convert Oracle syntax to MariaDB multi-table update syntax.