22. april 2002 - 08:29Der 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)
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
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)
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 :-)
>> 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)
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
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)
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?
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
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
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)
(+) 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)
>>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)
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.
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
Synes godt om
Ny brugerNybegynder
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.