Toon posts:

[SQL] leuk INSERT vraagstukje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb 3 tabellen:
tblObjekten
tblEigenschappen
tblObjektEigenschappen

tblObjekt heeft de volgende velden:
ObjektId

tblEigenschappen heeft de volgende velden:
EigenschapId
EigenschapNaam

tblObjektEigenschappen heeft de volgende velden:
ObjektId
EigenschapId
EigenschapWaarde

Even voor het voorbeeld:
In de tabel tblObjekt staan nu 10 objekten
In de tabel tblEigenschappen staan 3 eigenschappen. (Bijv Objektnaam, Kleur, Gewicht)
In de tabel ObjektEigenschappen staat dan voor elk objekt alle eigenschappen met de bijbehorende waarden hiervan. Dus in ons voorbeeldje 30 records.

Nu is er een probleem als er een eigenschap wordt toegevoegd aan de tabel tblEigenschappen. Voor elk objekt moet dan deze eigenschapId ook in de tabel tblObjektEigenschappen worden opgeslagen.

Ik wil een SQL scriptje maken, dat alle Objekten (ObjektId) en bijbehorende Eigenschappen (EigenschapId) naar de tabel tblObjektEigenschappen insert, maar dan alleen voor de objekten en eigenschappen waarvan de kombinatie nog niet voorkomt in de tabel tblObjektEigenschappen.

Wie o wie heeft een tip om dit op te lossen, en is het mogelijk met SQL?

Ik heb al diverse dingen geprobeerd ook al door een toevoegquery te maken in access, en dan als bron de tabellen tblObjekten en tblEigenschappen, zonder Join ertussen te plaatsen. Dit wil wel als de tabel tblObjektEigenschappen nog helemaal leeg is, maar het moet ook werken als hier al wat in staat, en eigenlijk moet hij deze tabel dus gewoon helemaal bijwerken zodat alle ontbrekende kombinaties van ObjektId en EigenschapId worden toegevoegd.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:50

Dido

heforshe

Je hebt dus in je koppeltabel een cartesiaans produkt staan van tblEigenschappen en tblObject. Nooit gedacht dat ik die nog eens zou gebruiken :)

In principe levert

code:
1
2
3
4
5
SELECT A.ObjektID, B.EigenschapID, NULL
  FROM tblObjekt        A
     , tblEigenschappen B
 WHERE A.ObjektID     NOT IN ( SELECT ObjecktID FROM tblObjektEigenschappen )
    OR B.EigenschapID NOT IN ( SELECT EigenschapID FROM tblEigenschappen )

Je dan een lijst op van nog te inserten records, of zie ik dat verkeerd?
Als dat klopt, kun je die inbouwen in een INSERT lijkt me :)

[ Voor 3% gewijzigd door Dido op 27-01-2004 01:40 ]

Wat betekent mijn avatar?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wanneer je een eigenschapid toevoegt bestaat die eigenschap id per definitie niet in je tabel. Je kunt dan dus in een insert trigger de rijen inserten. Je vermijdt dan deadlocks denk ik, die je anders wellicht zult hebben op systemen waar readers geblockt worden door writers (Sqlserver bv).

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

lezen... :(

[ Voor 94% gewijzigd door Jaspertje op 27-01-2004 10:19 ]


Verwijderd

Topicstarter
Dido schreef op 27 januari 2004 @ 01:38:
Je hebt dus in je koppeltabel een cartesiaans produkt staan van tblEigenschappen en tblObject. Nooit gedacht dat ik die nog eens zou gebruiken :)

In principe levert

code:
1
2
3
4
5
SELECT A.ObjektID, B.EigenschapID, NULL
  FROM tblObjekt        A
     , tblEigenschappen B
 WHERE A.ObjektID     NOT IN ( SELECT ObjecktID FROM tblObjektEigenschappen )
    OR B.EigenschapID NOT IN ( SELECT EigenschapID FROM tblEigenschappen )

Je dan een lijst op van nog te inserten records, of zie ik dat verkeerd?
Als dat klopt, kun je die inbouwen in een INSERT lijkt me :)
Bedankt voor de tip in de goede richting!!
Voor de geinterresseerden hierbij de uiteindelijke juiste oplossing:

code:
1
2
3
4
5
6
SELECT tblObjekt.ObjektId, tblEigenschap.EigenschapId
FROM tblObjekt, tblEigenschap
WHERE (((tblObjekt.ObjektId) Not In 
(SELECT ObjektID FROM tblObjektEigenschap WHERE EigenschapId = tblEigenschap.EigenschapId)))
OR (((tblEigenschap.EigenschapId) Not In 
(SELECT EigenschapID FROM tblObjektEigenschap WHERE objektID = tblObjekt.ObjektId)));

[ Voor 14% gewijzigd door Verwijderd op 27-01-2004 11:42 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:50

Dido

heforshe

Ik bedacht me inderdaad vannacht om half drie dat die where clauses niet volledig waren :)
Maar daar was je zelf al achter gekomen.

Nogmaals, ik boekmark deze draad omdat het de eerste keer is dat ik een cartesiaans product nuttig gebruikt zie. (Normaliter is het een foutje)

Wat betekent mijn avatar?

Pagina: 1