Reputation:
I want to SET
the price of SOFTWARE
to some other value depending on two conditions:
SOFTWARE
that have a name that starts with M.
SOFTWARE
that are installed in the INSTALLER
table
Code:
SELECT N_SOF,NAMESOF FROM SOFTWARE;
N_SOF NAMESOF
---------- -------------------------
64 WINDOWS
70 WINDOWS
71 MAC
72 MAC
73 MAC
SELECT N_INS,N_SOF FROM INSTALLER;
N_INS N_SOF
---------- ----------
3 71
3 72
12 73
I tried this, in SQL*PLUS (ORACLE), but it didn't work.
SQL> UPDATE SOFTWARE
2 SET PRICE= PRICE+100
3 INNER JOIN INSTALLER I ON I.NLOG=SOFTWARE.N_SOF
4 WHERE SOFTWARE.NAMESOF='M%' AND I.N_INS=3;
I got this error message
INNER JOIN INSTALLER I ON I.NLOG=LOGICIEL.NLOG
*
ERROR at line 3:
ORA-00933: SQL command not properly ended
Upvotes: 1
Views: 68
Reputation: 167822
Use UPDATE
with an EXISTS
clause:
UPDATE SOFTWARE s
SET PRICE= PRICE+100
WHERE NAMESOF LIKE 'M%'
AND EXISTS(SELECT 1
FROM INSTALLER i
WHERE i.N_SOF=s.N_SOF
AND i.N_INS=3);
Which, for the sample data:
CREATE TABLE software (N_SOF, NAMESOF, price) AS
SELECT 64, 'WINDOWS', 0 FROM DUAL UNION ALL
SELECT 70, 'WINDOWS', 0 FROM DUAL UNION ALL
SELECT 71, 'MAC', 0 FROM DUAL UNION ALL
SELECT 72, 'MAC', 0 FROM DUAL UNION ALL
SELECT 73, 'MAC', 0 FROM DUAL;
CREATE TABLE INSTALLER (N_INS, N_SOF) AS
SELECT 3, 71 FROM DUAL UNION ALL
SELECT 3, 72 FROM DUAL UNION ALL
SELECT 12, 73 FROM DUAL;
After the update then:
SELECT * FROM software
Outputs:
N_SOF NAMESOF PRICE 64 WINDOWS 0 70 WINDOWS 0 71 MAC 100 72 MAC 100 73 MAC 0
db<>fiddle here
Upvotes: 1
Reputation: 86706
UPDATE SOFTWARE
SET PRICE= PRICE+100
WHERE
SOFTWARE.NAMESOF LIKE 'M%'
AND EXISTS (
SELECT *
FROM INSTALLER I
WHERE I.NLOG=SOFTWARE.N_SOF
AND I.N_INS=3
)
Upvotes: 2