Avatar billede Lasse Novice
04. september 2002 - 17:44 Der er 8 kommentarer og
1 løsning

Nested sql udtraek

Jeg har 2 tabel. For nemhedens skyld, ser de saaledes ud:

TABEL1
kol1      kol2
--------------
n1          a1
n1          a2
n2          a3
n2          a4
n3          a2
n3          a3

TABEL2
kol3      kol4      path
------------------------
a1          t1      NULL
a2          t3      NULL
a3          t3      NULL
a4          t2      NULL
a5          t3      NULL


path skal nu opdateres. Opdateringen sker ved at jeg kommer med en kol1 og en kol4 vaerdi (og en vaerdi for path). Det kunne f.eks vaere t2, n3 (og "c:\").

Nu er det saa meningen at disse raekker(som jeg selekterer i select saetningen) skal opdateres saaledes at path bliver sat til "c:\":

select * from TABEL1, TABEL2 where kol4='n3' and kol3=kol2 and kol1='n3'

Det viser sig imidlertidigt nu at de resultater(isaer kol2) jeg faar ud af dette udtraek, er:

kol2
----
a2
a3

Kigger man lidt paa kol2, saa gaar a2 igen for n1 of a3 gaar igen for n2. n1 har ogsaa a1 og n2 har ogsaa a4, saa disse skal OGSAA have path opdateret.

Dette er et lille eksempel, men det kan hurtig eskalere(hvis nu a1 gik igen i en helt 3. kol1). Kan man paa en eller anden smart maade lave en sej SQL saetning der driver ALLE kol3 ud som skal opdateres til den samme path?
Avatar billede bennytordrup Nybegynder
04. september 2002 - 19:31 #1
Din select kan omskrives til følgende select:

select *
from tabel1 t1 inner join tabel2 t2 on t1.kol2=t2.kol3

efterfulgt af en where.

Den select, jeg har givet, giver følgende resultat (svarende til de kombinationer, der er ridset op ud fra ovenstående)

n1    a1    a1    t1    NULL
n1    a2    a2    t3    NULL
n2    a3    a3    t3    NULL
n2    a4    a4    t2    NULL
n3    a2    a2    t3    NULL
n3    a3    a3    t3    NULL


Hvilke rækker skal opdateres?
Avatar billede Lasse Novice
04. september 2002 - 21:39 #2
ja, det er nemlig det der er problemet... Det viser sig til at starte med at det er dem hvor kol1=n3 og kol4=t3(jeg kom til at skrive t2 foer, men det er t3). Dvs.

1) n3    a2    a2    t3    NULL
2) n3    a3    a3    t3    NULL


Her ses det at kol2=a2 og a3. Dvs. de skal opdateres i TABEL2. Men der er ogsaa andre raekker hvor kol2=a2 eller kol2=a3:

3) n1    a2    a2    t3    NULL
4) n2    a3    a3    t3    NULL

Dvs. at jeg nu faar nye soegeord(foerst var det t3,n3. Nu er det henholdsvis n1, t3 og n2, t3). Nu er det ikke tilfaeldet, men HVIS der ogsaa havde vaeret en raekke:
5) n2    a4    a4    t3    NULL

saa skulle denne ogsaa opdateres! Det skyldes at 4) har samme kol1 og kol4 som 5). Det medfoerer at vi nu istedet for a2 og a3 har a2, a3 og a4. Dette kan blive ved med at eskalere, men paa et tidspunkt vil der ikke vaere flere. Ogsaa er jeg faerdig! Men jeg ville bare tro at dette cirkel raes kunne hentes via een SQL saetning.
Avatar billede bennytordrup Nybegynder
04. september 2002 - 23:36 #3
Denne her:

select    *
from    tabel1 t1
        inner join tabel2 t2
        on t1.kol2=t2.kol3
where    t1.kol1='n3' or t2.kol4='t3'

giver:

n1    a2    a2    t3    NULL
n2    a3    a3    t3    NULL
n3    a2    a2    t3    NULL
n3    a3    a3    t3    NULL
Avatar billede bennytordrup Nybegynder
04. september 2002 - 23:38 #4
Sætter jeg data ind, så jeg vil få en række som 5), så¨vil denne:

select    distinct *
from    tabel1 t1
        inner join tabel2 t2
        on t1.kol2=t2.kol3
where    t1.kol1='n3' or t2.kol4='t3'

give:

n1    a2    a2    t3    NULL
n2    a3    a3    t3    NULL
n2    a4    a4    t3    NULL
n3    a2    a2    t3    NULL
n3    a3    a3    t3    NULL
Avatar billede Lasse Novice
05. september 2002 - 00:02 #5
ok, nu har jeg ikke lige selv testet noget af det du skriver, men:

select    *
from    tabel1 t1
        inner join tabel2 t2
        on t1.kol2=t2.kol3
where    t1.kol1='n3' or t2.kol4='t3'

vil jeg formode giver:

n3    a2    a2    t3    NULL
n3    a3    a3    t3    NULL

og ikke

n1    a2    a2    t3    NULL
n2    a3    a3    t3    NULL
n3    a2    a2    t3    NULL
n3    a3    a3    t3    NULL

eftersom kol1='n3'

er det ikke sandt?
Avatar billede Lasse Novice
05. september 2002 - 00:12 #6
Jeg har saadanne set loest det med SQL saetninger, men jeg er ikke tilfreds med resultatet. Jeg poster dem lige, saa kan det vaere at det er nemmere at forstaa problemet:

        SELECT distinct kol2 FROM TABLE1, TABLE2
        WHERE kol2=kol3 and
        kol4='cajlog-tx0' and
        kol1 in (
            SELECT DISTINCT kol1 FROM TABLE1, TABLE2
            WHERE kol2=kol3 and            kol4='cajlog-tx0' and
            kol2 in (
                SELECT kol2 FROM TABLE1, TABLE2
                WHERE kol2=kol3 and
                kol1='FO150' and kol4='cajlog-tx0'
            )
        )

Her vil jeg nu faa et antal kol2 vaerdier ud. Jeg proever nu paa dette resultat at goere:

        SELECT distinct kol2 FROM TABLE1, TABLE2
        WHERE kol2=kol3 and
        kol4='cajlog-tx0' and
        kol1 in (
            SELECT DISTINCT kol1 FROM TABLE1, TABLE2
            WHERE kol2=kol3 and            kol4='cajlog-tx0' and
            kol2 in (
                                TIDLIGERE RESULTAT
                        )
              )

Faar jeg de samme vaerdier ud, saa er jeg faerdig... faar jeg flere, saa skal jeg proeve endnu engang.... indtil jeg faar samme antal ud som forrige udtraek
Avatar billede bennytordrup Nybegynder
05. september 2002 - 08:21 #7
IMHO tror jeg, at du får svært ved at løse det i ren SQL.

Hvad siger din datamodel omkring sammenhæng mellem de to tabeller? Hvad er grundlaget for at dele det i to tabeller, når der åbenbart er så mange ting, der skal opfyldes for, at et bestemt felt skal opdateres.
Avatar billede Lasse Novice
05. september 2002 - 16:51 #8
Umiddelbart vil arbejdsbyrden ikke mindskes, hvis de slaas sammen... men....

det er lagt paa denne maade, da vi oensker mindsket muligheden for fejl ved indsaettelse i databasen.

Hmmm...
Avatar billede Lasse Novice
18. september 2002 - 16:38 #9
ja, jeg har stadig ikke fundet et bedre svar...
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