Avatar billede hrc Mester
30. april 2008 - 14:42 Der er 9 kommentarer og
1 løsning

Opret de manglende relationer i en enkelt insert-sætning

Givet er 3 tabeller: Gruppe, Form og GruppeFormRel

GruppeFormRel hægter de to andre sammen. GruppeID og FormID er den sammensatte primærnøgle.

Ideen er at have en enkelt "insert"-kommando der sørger for at manglende relationer oprettes

Eksempel:
---------
GruppeID'er: 1,2,3,4,5
FormID'er: 10,20,30,40,50

I GruppeFormRel findes:
1,10
1,20
1,30
1,40
2,10
2,20
2,30
3,10

Når insert-kommandoen er kørt skal alle manglende relationer være indsat, resulterende i 25 records i alt

Jeg har lavet et script der finder de relationer der overhovedet ikke er repræsenteret i relationen (nye grupper, nye forme), men mangler de som allerede er i brug.

Scriptet ser således ud:

  select g.ID as gruppeID, f.ID as formID, 0, 0, 0, 0 from gruppe g
    join form f on (f.ID in (select distinct gfr2.formID from gruppeformrel gfr2))
    where g.ID not in (select distinct gfr1.gruppeID from gruppeformrel gfr1)

Resultat på ovenstående:
------------------------
4,50
5,50

Mangler resten:
---------------
1,50
2,40
2,50
3,20
3,30
3,40
3,50
4,10
4,20
4,30
4,40
5,10
5,20
5,30
5,40

Kan sådan et script laves?
Avatar billede fennec Nybegynder
30. april 2008 - 15:30 #1
Ved ikke om du kan bruge det, men du kan lave et script som generere alle relationer. Det gøres ved ikke at definere en join:

select gruppeId, formID from Gruppe, Form
order by gruppeID, formID
Avatar billede fennec Nybegynder
30. april 2008 - 15:34 #2
Hvis du allerede har gemt nogle relationer, burde overstående script kunne ændres til ikke at vise de allerede eksisterende, og derved kun give dig de manglende.

Jeg ville nok vælge bare at slette alle gemte relationer, også oprette dem igen ud fra "find alle relationer" scriptet.
Avatar billede hrc Mester
30. april 2008 - 23:22 #3
Relationen indeholder samtidig adgangsrettigheder m.m. for den pågældende gruppe/form relation, så jeg kan ikke slette dem. Måske ender jeg med en SProc så det holdes på serversiden.
Avatar billede HenrikSjang Nybegynder
02. maj 2008 - 16:50 #4
Da dine id'er har værdier som de har, kan denne hjælpe dig:

INSERT INTO GruppeFormRel
SELECT g.ID, F.ID
FROM Gruppe g
CROSS JOIN Form f
WHERE g.ID + f.ID NOT IN (SELECT GruppeID + FormID FROM GruppeFormRel)
Avatar billede hrc Mester
02. maj 2008 - 22:10 #5
sjang: Nu er ovenstående bare et eksempel. Mine id'er er identity startende fra 1 og tæller op med 1. Kan måsle caste det til en streng så der sammenlignes på "000001000023" i stedet for sammensatte nøgle 24 - eller noget lignende.
Avatar billede HenrikSjang Nybegynder
03. maj 2008 - 01:02 #6
Ja det ville nok egentlig være mere sikkert. Fx sådan her:

INSERT INTO GruppeFormRel
SELECT g.ID, F.ID
FROM Gruppe g
CROSS JOIN Form f
WHERE CAST(g.ID AS VARCHAR(50)) + '-' + CAST(f.ID AS VARCHAR(50)) NOT IN (SELECT CAST(GruppeId AS VARCHAR(50)) + '-' + CAST(FormId AS VARCHAR(50)) FROM GruppeFormRel)
Avatar billede hrc Mester
04. maj 2008 - 22:27 #7
Cast 50?? Nu er det vel kun 32 bit nøgler der kan blive tale om... Tror cast til varchar(10) vil være alt rigeligt. Det skal jeg teste i morgen.

Hvad er et cross-join? Er det noget der kan køres på MSSQL 2000?
Avatar billede HenrikSjang Nybegynder
04. maj 2008 - 22:47 #8
ja varchar(10) vil nok være rigeligt... jeg har bare varchar(50) siddende på fingrespidserne, så det er såmænd bare derfor jeg valgte det.

Et cross-join laver et krydsprodukt over alle kombinationsmuligheder. Dvs at hver række i den venstre tabel, sammensættes med alle rækkerne fra den højre tabel. Dvs, at antallet af rækker i den resulterende tabel bliver a X b, hvor a er antallet af rækker i den ene tabel, og b er antallet af rækker i den anden tabel. I dit tilfælde vil cross-join'et præcis indeholde de 25 kombinationsmuligheder/relationer der i alt er.

Og ja, jeg vil bestemt mene at et cross join også findes på sql 2000
Avatar billede hrc Mester
05. maj 2008 - 09:38 #9
Det virker og nu kender jeg "cross join", mange tak. Nu mangler du bare at lægge et svar.
Avatar billede HenrikSjang Nybegynder
05. maj 2008 - 15:55 #10
Det kommer så her.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester