Avatar billede mbagge Nybegynder
02. juni 2008 - 14:54 Der er 1 kommentar og
1 løsning

Generer kombinationer / select data uden duplicate data sæt

Jeg har en jointabel der indeholder data definere kombinationer:

* ID - OptionID - VariantID2
1 - 11 - 101
2 - 31 - 101
3 - 51 - 101
4 - 11 - 102
5 - 31 - 102
6 - 52 - 102

Hver variant indeholder alså 3 optioner (og altid 3)
10ere, 30ere og 50ere komm

er fra hver sin type af optioner. Hvis jeg derfor gerne vil tilføje en kombination der indeholder 53, skal jeg tilføje rækkerne

7 - 11 - 103
8 - 31 - 103
9 - 53 - 103

Dette er simpelt nok i dette tilfælde, men noget mere kompliceret når/hvis der også ligger rækker/kombinationer med 22,23,24,32,33 osv osv

Jeg har 2 tilgangsvinkler til dette.

1) Beregn alle kombinationer
Dette vil så vidt jeg kan se kræve at der loopes inde i loop ala
for x = 11 to 15
  for y = 31 to 33
    osv...
Dette virker delt ikke særlig hensigtmæssigt, og giver nogle problemer med at lave et script som kan håndtere et ubegrænset antal optionstyper

2) Generer nye entries ud fra eksisterende kombinationer
Hvis man sammenligner ovenstående tabeldata eksempler, kunne man måske forestille sig en select, som ikke returnerede duplicate sæt af data. Fx i første data eksmpel at selecte alle entries som ikke tilhøre samme options type (altså ingen entries i 50erne) men heller ikke de duplicate sæt som derved fremkommer.

Dvs selectes uden 50erne fås følgende data:
1 - 11 - 101
2 - 31 - 101
4 - 11 - 102
5 - 31 - 102

Hvis man via sql kunne fjerne det ene sæt, ville det jo være nemt at generere de nye linier - som jo netop er det ene sæt 11+31 plus  den nye option 51

Har i nogle ideer til løsning en fornuftig måde at løse mulighed 1 eller 2 på? Eller måske en helt trejde løsning?

/Bagge
Avatar billede aaberg Nybegynder
03. juni 2008 - 15:37 #1
Ville det ikke være smartere at have hver sin kolonne til hver sin optionstype, når der nu altid er et tal for hver optionstype? Dette ville elimere din problemstilling.

Ellers bliver du nød til at lave en query som først deler rækkerne op i kolonner, og derefter udføre logikken. Dette vil blive en tung query når der kommer manger rækker i tabellen.
Avatar billede mbagge Nybegynder
03. juni 2008 - 18:31 #2
Det er desværre ikke en mulighed da metoden skal virke med et ubegrænset antal optionstyper (11,31,51,71,91)

Jeg har dog fundet en løsninger som kan bruges ved netop 3 optionstyper, i tilfælde af at andre skulle stå med samme problem


-- generate test data --
select * into #t1 from (select
1 , 11 , '111'  union all select
2 , 11 , '121'  union all select
3 , 11 , '131'  union all select
4 , 12 , '111'  union all select
5 , 12 , '121'  union all select
6 , 12 , '132'  union all select
7 , 13 , '111'  union all select
8 , 13 , '121'  union all select
9 , 13 , '133'  union all select
10 , 14 , '111'  union all select
11 , 14 , '122'  union all select
12 , 14 , '131'  union all select
13 , 15 , '111'  union all select
14 , 15 , '122'  union all select
15 , 15 , '132'  union all select
16 , 16 , '112'  union all select
17 , 16 , '121'  union all select
18 , 16 , '133' )f(x,y,z)

-- select the groups
select a.* from #t1 a join (
  select min(y)'y' from (
    select y, min(z)'miz', max(z)'maz' from #t1
    where z not like '13%' group by y
    )f group by miz, maz
  )b on a.y=b.y
where z not like '13%'

-- cleanup
drop table #t1

Jeg er endt med en løsning der understøtter ubegrænset antal option, men som benytter en het anden fremgangsmåde. Denne er slet ikke er i stil med ovenstående, og jeg vil derfor udelade løsningen her.
Hvis nogle skulle ende med samme problem med flere varianttyper, så grib endelig fat i mig
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