Avatar billede fuxi Nybegynder
22. april 2002 - 08:29 Der er 23 kommentarer og
1 løsning

Må kunne gøres nemmere

Jeg har lavet en funktion der skal kunne trække nogle destinationer ud af 2 tabeller. Det vil sige jeg har en tabel der indeholder den originale geografi og en der indeholder geografien oversat.. Nu vil jeg gerne sætte de 2 tabeller sammen således at alle destinationer der ikke er oversat bliver den originale geografi.. Jeg har sådan set lavet en funktion der gør det som jeg ønsker men det må kunne gøres nemmere...
100 point til den der kan finde en bedre og pænere løsning..

Min løsning ser sådan ud:

Function getDestinationsListbox(strDestinationTypes)
        'Create temporary view of destination
        sql = ""
        sql = sql & "CREATE VIEW TMP_DESTINATION AS "
        sql = sql & "SELECT    d.destinationid , d.englishname "
        sql = sql & "FROM      destination d "
        sql = sql & "where      destinationtypeid in (" & strDestinationTypes &  ")"
        dbCon.Execute(sql)
       
        'Create temporary view of destination_lang       
        sql = ""
        sql = sql & "CREATE VIEW TMP_DESTINATION_LANG AS "
        sql = sql & "SELECT    dl.DestinationID, dl.TranslatedName "
        sql = sql & "FROM      destination d, destination_lang dl "
        sql = sql & "WHERE      d.DestinationTypeID IN (" & strDestinationTypes &  ") and dl.languageid=" & getPortalLanguageID() & " and d.destinationid=dl.destinationid"
        dbCon.Execute(sql)
       
        'Join the two views
        sql = ""
        sql = sql & "SELECT TMP_DESTINATION.DestinationID, TMP_DESTINATION.EnglishName, TMP_DESTINATION_LANG.TranslatedName "
        sql = sql & "FROM     TMP_DESTINATION LEFT OUTER JOIN "
        sql = sql & "        TMP_DESTINATION_LANG ON TMP_DESTINATION.destinationid = TMP_DESTINATION_LANG.DestinationID"
        Set rs = dbCon.Execute(sql)

        'Create HTML for listbox
        strHTML = strHTML & "<select name='destinationID'>"
        While Not rs.eof
            strHTML = strHTML & "<option value='" & rs("destinationID") & "'>"
            If rs("translatedName")<>"" Then
                strHTML = strHTML & rs("TranslatedName")
            Else
                strHTML = strHTML & rs("EnglishName")
            End If
            strHTML = strHTML & "</option>"
            rs.MoveNext
        Wend
        strHTML = strHTML & "</select>"

        'Drop views
        sql = ""
        sql = sql & "DROP VIEW TMP_DESTINATION"
        dbCon.Execute(sql)       
        sql = ""
        sql = sql & "DROP VIEW TMP_DESTINATION_LANG"
        dbCon.Execute(sql)

        getDestinationsListbox = strHTML
End Function

/Fuxi
Avatar billede fuxi Nybegynder
22. april 2002 - 08:29 #1
Nå ja dbCon er bare min database forbindelse :o)
Avatar billede seraphiel Nybegynder
22. april 2002 - 09:08 #2
Puha, det ser indviklet ud.. :D
Avatar billede askhoej Praktikant
22. april 2002 - 09:24 #3
Hvorfor oprette og droppe views???? - Og så bagefter joine dem??

Du må kunne nøjes med at lave en generelt view til at lave din DropDown
Avatar billede fuxi Nybegynder
22. april 2002 - 15:37 #4
Hmm ikke forstået!!!
Jeg opretter 2 views fordi jeg ikke kunne få min join til at virke efter hensigten uden at lave de 2 views først. Grunden til at jeg dropper mine views er at næste gang vil de typisk se anderledes ud, jeg har flere sprog, flere forskellige destinationsTyper og på den måde temmelig mange kombinationer. Så derfor dropper jeg mine views lige efter at jeg har brugt dem.
Men hvis der er en der kan få det hele til at ske i en query så ville det være kanon... man burde egentlig også kunne lave en CASE på felterne EnglishName og TranslatedName i sql så jeg slap for min sammenligning i ASP... Jeg håber der er en der kan finde en bedre løsning end min, for den er sku ikke optimal ;o)
Avatar billede askhoej Praktikant
22. april 2002 - 16:52 #5
Hey fuxi

kan du ikke lige skrive dine tabeller og hvad du vil have ud af dem, så skal jeg på at skrive en optimeret forespørgsel. Ovenstående er en MEGET ond forespørgsel :-)
Avatar billede askhoej Praktikant
22. april 2002 - 16:53 #6
..forsøge at skrive en optimeret forespørgsel..
Avatar billede fuxi Nybegynder
22. april 2002 - 17:47 #7
Hmm lyder kanon askhoej :O)

Her kommer lige tabellerne:

>> destination <<
DestinationID (Primær nøgle)
ParentID (Vil typisk pege på en anden destination)
DestinationTypeID (Kan være 1,2,3,4,5 i mit tilfælde er den 4 og 5)
EnglishName (Destinationens navn på engelsk)

>> destination_lang <<
DestinationLangId (Primær nøgle)
DestinationID
LanguageID (Kan være 1,2,3,4 i mit tilfælde er den 2 for dansk)
TranslatedName (Destinationens oversatte navn)

Det jeg gerne vil have til at ske er følgende i en simpel udgave:

>> destination indeholder <<
ID EnglishName
01 Denmark
02 Sweden
03 Hungary
04 Germany

>> destination_lang indeholder <<
ID TranslatedName LanguageID
01 Danmark        2
02 Sverige        2

>> resulat <<
ID DestinationName
01 Danmark
02 Sverige
03 Hungary
04 Germany

Det ville være helt kanon, specielt hvis de også var sorterede :o)

/Fuxi
Avatar billede askhoej Praktikant
22. april 2002 - 17:55 #8
oki

hvad kunne strDestinationTypes f.eks indeholde?
Avatar billede askhoej Praktikant
22. april 2002 - 18:09 #9
SELECT d.destinationid,dl.translatedname
    FROM destination d, destination_lang dl
        WHERE d.destinationID = dl.destinationID
        AND d.destinationtypeID IN (" & strDestinationTypes &  ")
        AND dl.languageid = " & getPortalLanguageID() & "
            ORDER BY dl.translatedname

Pas på med at bruge IN da den er meget tung.
Avatar billede fuxi Nybegynder
22. april 2002 - 19:15 #10
Hmm underligt det ser ud til at der stadig er et problem....

Først kan jeg da lige sige at strDestinationTypes i mit tilfælde vil indeholde "4,5" og at det betyder lande(4) og territorier(5)

Nå men mit problem er at jeg kun får en count på 200 ud af din sql og at jeg får 238 hvis jeg laver følgende sætning:
SELECT COUNT(destinationID) FROM destination WHERE destinationTypeID IN (4,5)

Resultaterne burde være lige store..

Jeg håber at du kan knække nødden :O)
Avatar billede askhoej Praktikant
22. april 2002 - 20:17 #11
Hvor mange kommer der her:

SELECT COUNT(d.destinationID)
  FROM destination d, destination_lang dl
  WHERE d.destinationID = dl.destinationID
  AND d.destinationTypeID IN (4,5)

??
Avatar billede fuxi Nybegynder
22. april 2002 - 20:55 #12
Hmm der kommer 235 med den søgning, men her har du heller ikke valgt sprog... Det vil sige du har ikke skrevet dl.lanugageID=2 hvilket resulterer i en indsnævring... Med din count får du sikkert lidt flere ud da der er flere sprog i datbasen, og dermed er sandsynligheden for at en oversat tekst eksisterer større... Men jeg må indrømme at den er tættere på de 238 ;O)
Al min logik siger også at din sql skulle virke.. Jeg var faktisk nået frem til samme resultat før jeg lavede min giftige kode som laver views etc... Kunne det være en fejl i SQL-Server?
Avatar billede fuxi Nybegynder
22. april 2002 - 21:18 #13
Hmm jeg har fundet frem til en simplere løsning men stadig ikke 100% optimal...

CREATE VIEW tmp_destinations AS
SELECT destination.DestinationID, destination.EnglishName, destination_lang.TranslatedName,                                destination.destinationTypeID, destination_lang.LanguageID                                                FROM destination LEFT OUTER JOIN
destination_lang ON destination.DestinationID = destination_lang.DestinationID AND languageID = 2

Dette giver et view hvor jeg så kan lave en SELECT COUNT(*) FROM tmp_destinations WHERE destinationTypeID IN (4,5)
Dette giver det rigtige resultat under alle omstændigheder er mængden rigtig.. Jeg mangler dog stadig at kunne få de to rækker EnglishName og TranslatedName merged til en DestinationName så jeg kan få sorteret dem rigtigt....
/Fuxi
Avatar billede askhoej Praktikant
22. april 2002 - 21:57 #14
Hvor mange hits gir:

SELECT count(1)
    FROM destination d, destination_lang dl
        WHERE d.destinationID(+) = dl.destinationID
        AND d.destinationtypeID IN (" & strDestinationTypes &  ")
        AND dl.languageid = " & getPortalLanguageID() & "
            ORDER BY dl.translatedname
Avatar billede fuxi Nybegynder
23. april 2002 - 07:57 #15
Sorry jeg ikke fik svaret på dit spørgsmål igår...
Jeg har lige testet din sql her til morgen.. Den virkede ikke, men efter at have modificeret den lidt tror jeg at det hele virker... Under alle omstændigheder siger mit count 238 som det skal :O)    Jeg tester det lige ordentligt når jeg kommer hjem fra arbejde ;o)

Min sql ser ud som følgende nu:
SELECT count(*) AS mycount
FROM destination d, destination_lang dl
WHERE d.destinationID *= dl.destinationID
AND d.destinationtypeID IN (4,5)
AND dl.languageid = 2

Da du skrev (+) bag d.destinationID kom jeg i tanke om et eller andet jeg havde set før nemlig *= så nu ser det ud til det virker.. Du får lige pointene når jeg har tjekket det nærmere der hjemme ;o)
Avatar billede askhoej Praktikant
23. april 2002 - 08:18 #16
perfekt

(+) er en outer join på en Oracle database. Der er åbentbart ikke en oversættelse til alle dine destinationer i destination_lang tabellen.

Den her må du så:

SELECT d.destinationid,dl.translatedname
    FROM destination d, destination_lang dl
        WHERE d.destinationID *= dl.destinationID
        AND d.destinationtypeID IN (" & strDestinationTypes &  ")
        AND dl.languageid = " & getPortalLanguageID() & "
            ORDER BY dl.translatedname

Hvis du vil optimere den en smule mere, så brug:

AND (d.destinationtypeID = 4 OR d.destinationtypeID = 5)

i stedet for:

AND d.destinationtypeID IN (4,5)
Avatar billede fuxi Nybegynder
23. april 2002 - 09:26 #17
>>AND d.destinationtypeID IN (4,5)
Ja det har jeg faktisk også overvejet at gøre, da der max vil komme 3 samtidige det vil sige 4,5,6 OR er trods alt hurtigere end IN :O)
Du har vel ikke en smart måde at få smidt de 2 rækker sammen, det vil sige EnglishName og TranslatedName bliver til DestinationName... Men de skal ikke bare smides sammen uden betingelser.. Betingelserne vil være noget lignende dette:

CASE TranslatedName IS NULL THEN TranslatedName AS DestinationName
ELSE EnglishName AS DestinationName

På den måde skulle jeg gerne få alle Danske destinationer over i destinationName, og der hvor der ikke er et dansk navn for destinationen skulle der gerne komme det engelske navn..
Grunden til at gøre dette er at så kan jeg lave en SORT BY destinationame og dermed få destinationerne ud sorteret rigtigt. Hvor jeg nu laver en sort by TranslatedName, Englishname... Dette giver en sjov sortering da der jo er <NULL> i flere af TranslatedName felterne..
Hvis du kunne knække den smider jeg glædeligt ekstra point oven i puljen... lad os sige 50point ekstra :O)
Avatar billede fuxi Nybegynder
23. april 2002 - 09:29 #18
Hmm sidder du forresten og arbejde med Oracle på arbejdet ?
Det gør jeg også ;o)
Avatar billede askhoej Praktikant
23. april 2002 - 10:23 #19
hmm..det var jo straks lidt værre, i Oracle findes der en funktion der hedder decode() som kan bruges til den slags små case ting m.m. Men aner ikke hvor det gøres på en SQL Server, du kan også bruge en stored procedure til at returnere dit RecordSet så kan man jo gøre alt :o)

Jeg har arbejdet meget på Oracle på arbejdet, men i øjeblikket skriver jeg afsluttende eksamensprojekt.
Avatar billede fuxi Nybegynder
23. april 2002 - 13:33 #20
Hmm det ser ud som om at der er noget der hedder CASE i sql server som kan bruges.. Men hvordan, det har jeg ikke lige regnet ud endnu...
Avatar billede fuxi Nybegynder
23. april 2002 - 19:36 #21
Kan du ikke lige lave et svar askhoej.... Du har kun besvaret med kommentar så det er ikke mugligt for mig at give dig point :o)
Avatar billede askhoej Praktikant
23. april 2002 - 19:45 #22
heps

Fandt du ud af det sidste?
Avatar billede askhoej Praktikant
23. april 2002 - 19:45 #23
ahhh....her er så et svar!!
Avatar billede fuxi Nybegynder
23. april 2002 - 20:01 #24
Hej mange mange tak for hjælpen askhoej..
Nej har ikke rigtig fået rodet med den sidste del... Men jeg har fundet ud af at man sikkert kan lave det med CASE.. Det kræver sikkert at jeg laver en stored procedure, men det gør jo heller ikke noget :o)

Ellers kan jeg jo altid lave det i min ASP... Det skulle ikke tage så lang tid at lave en bubble sort eller en quick sort... SÅ det er muligt at det bliver løsninge :O)  Under alle omstændigheder ligger koden som en funktion, så kan jeg jo altid ændre det hvis jeg får en lys ide :O)

Din kode ser under alle omstændigheder ud til at virke fint, hvis man da lige fjerne (+) og erstatter det med *  Men det er jo så en af de forskelle der er på Oracle og SQL Server...
Faktisk læste jeg at decode() i Oracle svarer til CASE i sql server... Så blev jeg også klogere idag...

/Fuxi
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
Kurser inden for grundlæggende programmering

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