De situatie is als volgt:
table1:
table2:
table3:
Voor elk record in table1 moet er een record in table3 geinsert óf geupdate worden.
Table2 fungeert hier als koppeltabel tussen table1 en table3; een partnummer is gekoppeld aan een product_id, en betreffende product_id moet dus in table3 komen.
Indien er al een combinatie van product_id & company_id in table3 voorkomt, dan moet er een update van de price plaatsvinden. In table3 zijn product_id en company_id samen de PK.
Ik dacht dit in 2 stappen op te gaan lossen, eerst een insert en daarna een update. Ik kom echter in de knoop met de company_id's.
Stel, ik wil alleen product_id en price inserten in table3 (het veld company_id negeer ik hier dan even), dan doe ik dat zo:
Oftewel, selecteer alle records uit table2 waarvan het product_id nog niet voorkomt in table3, koppel die aan de prijs uit table1 en insert die records in table3.
Echter, het probleem is zoals gezegd die company_id: hoe kan ik de unieke combinatie van product_id en company_id in één (of meerdere) subquery's vangen, zodat ik geen dubbele combinaties zal inserten? Door de PK-constraint krijg ik (terecht) een foutmelding zodra ik een duplicate key probeer te inserten, en dat wil ik dus niet
Zit me er nou al een tijd blind op te staren, maar het schiet niet echt op... zoiets zou het moeten worden, maar dan op de plek van de comments een hele mooie WHERE-clause die dubbele inserts voorkomt.
Het mooiste zou zijn als de stored procedure waarmee ik dit verhaal wil uitvoeren, gewoon duplicate-key inserts negeert (en dus niet stopt met executen als zoiets
zich voor doet, maar gewoon verder gaat met het volgende record), maar ik weet niet of dat mogelijk is.
Misschien zit ik wel helemaal op een verkeerd spoor; dus als iemand hier een beter idee over heeft, graag
table1:
| partnr | company_id | price |
| aap | c1 | 50 |
| aap | c2 | 48 |
| noot | c1 | 10 |
table2:
| product_id | partnr |
| 1 | aap |
| 2 | noot |
table3:
| product_id | company_id | price |
| 1 | c1 | 50 |
| 2 | c1 | 10 |
| 1 | c2 | 48 |
Voor elk record in table1 moet er een record in table3 geinsert óf geupdate worden.
Table2 fungeert hier als koppeltabel tussen table1 en table3; een partnummer is gekoppeld aan een product_id, en betreffende product_id moet dus in table3 komen.
Indien er al een combinatie van product_id & company_id in table3 voorkomt, dan moet er een update van de price plaatsvinden. In table3 zijn product_id en company_id samen de PK.
Ik dacht dit in 2 stappen op te gaan lossen, eerst een insert en daarna een update. Ik kom echter in de knoop met de company_id's.
Stel, ik wil alleen product_id en price inserten in table3 (het veld company_id negeer ik hier dan even), dan doe ik dat zo:
code:
1
2
3
4
5
6
7
8
9
| INSERT INTO table3 (product_id, price)
SELECT table2.product_id,
table1.price
FROM table1
INNER JOIN table2
ON table1.partnr = table2.partnr
WHERE table2.product_id NOT IN
( SELECT product_id
FROM table3 ) |
Oftewel, selecteer alle records uit table2 waarvan het product_id nog niet voorkomt in table3, koppel die aan de prijs uit table1 en insert die records in table3.
Echter, het probleem is zoals gezegd die company_id: hoe kan ik de unieke combinatie van product_id en company_id in één (of meerdere) subquery's vangen, zodat ik geen dubbele combinaties zal inserten? Door de PK-constraint krijg ik (terecht) een foutmelding zodra ik een duplicate key probeer te inserten, en dat wil ik dus niet
Zit me er nou al een tijd blind op te staren, maar het schiet niet echt op... zoiets zou het moeten worden, maar dan op de plek van de comments een hele mooie WHERE-clause die dubbele inserts voorkomt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
| INSERT INTO table3 (product_id, company_id, price)
SELECT table2.product_id,
table1.company_id,
table1.price
FROM table1
INNER JOIN table2
ON table1.partnr = table2.partnr
WHERE
/* en dan hier een subquery of clausule
die alle reeds bestaande combinaties
van product_id en company_id ophaalt
o.i.d. */ |
Het mooiste zou zijn als de stored procedure waarmee ik dit verhaal wil uitvoeren, gewoon duplicate-key inserts negeert (en dus niet stopt met executen als zoiets
zich voor doet, maar gewoon verder gaat met het volgende record), maar ik weet niet of dat mogelijk is.
Misschien zit ik wel helemaal op een verkeerd spoor; dus als iemand hier een beter idee over heeft, graag