[SQL] Update query met subquery en meerdere velden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Topicstarter
Ik durf het haast niet toe te geven, maar hier kom ik niet uit :'(

Oracle database.

Ik heb een query die over meerdere tabellen loopt, geen probleem. Het resultaat van deze query moet een aantal records in een andere tabel bijwerken, maar er is een samengestelde primaire sleutel, dus meerdere join condities.

Ik kom op internet veel tegen over IN() en =, correletated subqueries etc, maar ik snap nog steeds niet hoe ik het moet oplossen.

Een voorbeeld van een correlated subquery in een update statement:
SQL:
1
2
3
4
UPDATE A 
  SET S = (SELECT SUM(B)
             FROM B 
             WHEREA.A = A GROUP BY A)


Prima, maar moet ik ongeveer het volgende:

SQL:
1
2
3
4
5
UPDATE A 
  SET LOGIC_OK  = 'Y'
WHERE
  A.VELD1 = SUBQUERY.VELD1
  AND A.VELD2 = SUBQUERY.VELD2
Nou dat werkt natuurlijk niet aangezien de subquery nergens gedefinieerd is, maar de vraag is... waar moet dat?

Ik zou denken het volgende:
SQL:
1
2
3
4
5
6
UPDATE A 
  SET LOGIC_OK  = 'Y'
INNER JOIN 
         (SELECT VELD1, VELD2, ETC FROM A, B, C WHERE A.VELD1 = B.VELD1 ETC) SUBQUERY ON
      A.VELD1 = SUBQUERY.VELD1
      AND A.VELD2 = SUBQUERY.VELD2
Maar dat werkt niet.

Voorbeelden op internet plaatsen de SET aan het einde, maar ook dat werkt niet.

De inner join zelf is qua syntax juist:
SQL:
1
2
3
4
5
6
7
8
SELECT
 *
FROM
 A
INNER JOIN 
         (SELECT VELD1, VELD2, ETC FROM A, B, C WHERE A.VELD1 = B.VELD1 ETC) SUBQUERY ON
      A.VELD1 = SUBQUERY.VELD1
      AND A.VELD2 = SUBQUERY.VELD2
Dit werkt wel.

Mijn syntax in combinatie met het update statement zelf is niet in orde, maar waar?

Een makkelijke oplossing is om de subquery naar een tabel te laten schrijven (CREATE TABLE AS SELECT * FROM ETC), maar he... ik wil nu wel weten wat ik over het hoofd zie ;)

[ Voor 9% gewijzigd door Motrax op 23-03-2011 12:47 ]

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In MS SQL moet je een FROM opnemen

UPDATE Tabel1
SET veld = waarde
FROM Tabel1
INNER JOIN ....

geen idee of dit ook de oplossing is voor Oracle

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Topicstarter
Oracle kent die syntax helaas niet, dan was het een stuk makkelijker geweest ;)

Ik ben nu iets verder, maar nu werden alle records bijgewerkt met een NULL en sommige records met een 'Y'. Ik had er iets over gelezen met een EXISTS, zo even googlen.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE A
SET LOGIC_OK = 
(SELECT
'Y'
FROM (
SELECT
A.VELD1,
A.VELD2
FROM
 A
INNER JOIN 
         (SELECT VELD1, VELD2, ETC FROM A, B, C WHERE A.VELD1 = B.VELD1 ETC) SUBQUERY ON
      A.VELD1 = SUBQUERY.VELD1
      AND A.VELD2 = SUBQUERY.VELD2
);

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

P_de_B schreef op woensdag 23 maart 2011 @ 12:48:
In MS SQL moet je een FROM opnemen

UPDATE Tabel1
SET veld = waarde
FROM Tabel1
INNER JOIN ....

geen idee of dit ook de oplossing is voor Oracle
Niet waar, in MSSQL hoeft dat niet. Of bedoel je uitsluitend icm INNER JOIN eronder?

[ Voor 7% gewijzigd door Guillome op 23-03-2011 13:50 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Guillome schreef op woensdag 23 maart 2011 @ 13:49:
[...]

Niet waar, in MSSQL hoeft dat niet. Of bedoel je uitsluitend icm INNER JOIN eronder?
Ja, als je wilt joinen idd.

Een gewone update kan idd in de vorm UPDATE Tabel SET Veld = Waarde.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

In Oracle kan je met 'IN' meer kolommen in één keer matchen; je kan dus het volgende doen:

SQL:
1
2
3
4
5
6
UPDATE TABLE1
SET veld = 'blah'
WHERE (VELD1, VELD2) IN (
   SELECT Q.VELD1, Q.VELD2
   FROM SUBQUERY Q
);

Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Topicstarter
:o

Weer wat geleerd... dat deed inderdaad de truuk!

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |

Pagina: 1