/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Søge i mange tabeller med UNION ALL...
Fra : Søren G. Andersen


Dato : 11-08-04 12:45

Hejsa...!

Jeg vil gerne kunne søge i samtlige mine tabeller i min DB,
derfor har jeg lavet følgende SQL-sætning:

SQL = "SELECT billedsti, informationer FROM Antik "
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Arkiv WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL &   "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Bad WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Bygning WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Design WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Entre WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb1 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb2 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb3 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb4 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb5 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Greb6 WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Intdesign
WHERE informationer LIKE '%" & request.querystring("vaerdi") &
"%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM noegler WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"
   SQL = SQL & "UNION ALL "
   SQL = SQL & "SELECT billedsti, informationer FROM Stue WHERE
informationer LIKE '%" & request.querystring("vaerdi") & "%'"



Tekstombrydningen her er lidt whack, men det går nok...

Problemet er, at når jeg så søger, så virker det som om den går i
et uendeligt loop, eller noget...
Jeg har prøvet at indsætte response.writes' lige inden, og lige
efter denne SQL, men ingen af dem bliver overhovedet vist...
Når jeg kommenterer RS = Conn.Execute(SQL) ud, så får jeg mine
response'er udskrevet...

Jeg har kigget på:

http://www.asp-help.com/database/db_sql_ops.asp

og har modelleret min query efter dem, men jeg har som sagt
stadig problemer...

Nogle der kan hjælpe mig?!??

Funktionen kan prøves på www.lgbeslag.dk -> Søg.
Vælg "Alle" i drop-down menuen...

Jeg kan lige nå at se på HTML'en inden IE crasher, men det ser ud
som om den forsøger at udskrive ALT fra div. tabeller, istedet
for kun dem jeg har selected...!?

Mvh.

Søren

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (11-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-08-04 13:03

Søren G. Andersen skrev:

> Jeg vil gerne kunne søge i samtlige mine tabeller i min DB,

Det er umiddelbart ikke nogen god ide. Har du overvejet om din
datastruktur skal forbedres?

Ud fra dine tabelnavne ser det ud som om du skulle have en samlet
tabel (fx Produkter) og så have et felt der viser typen af
produkter.

UNION-forespørgsler er nødvendige i nogle sammenhænge, men det er
IMO altid bedre hvis man kan klare sig uden.


Men hvis du fortsat vil benytte UNION er der her en enkelt
kommentar:

> SQL = "SELECT billedsti, informationer FROM Antik "
> SQL = SQL & "UNION ALL "
> SQL = SQL & "SELECT billedsti, informationer FROM Arkiv
> WHERE
> informationer LIKE '%" & request.querystring("vaerdi") & "%'"

Gem WHERE-delen til efter sidste select (den vil stadig virke på
hele forespørgslen). Det bør drastisk forbedre ydelsen på
forespørgslen.

Samtidig er LIKE '%...%' en tung operation, fordi det er umuligt at
bruge indeks.


> Problemet er, at når jeg så søger, så virker det som om den
> går i et uendeligt loop, eller noget...


Det er nok bare forespørgslen der tager laaaang tid.


> Jeg kan lige nå at se på HTML'en inden IE crasher, men det ser ud
> som om den forsøger at udskrive ALT fra div. tabeller, istedet
> for kun dem jeg har selected...!?

Prøv evt. at udskrive den færdige sql (udkommenter conn.execute og
brug response.write). Den sql kan du så afprøve direkte i
databasen.

Men som nævnt - jeg tror at dit grundlæggende problem er en gal
datastruktur i databasen (altså forkert opbygning af tabellerne).
Lån evt. en bog om databaser på biblioteket eller forhør dig i
databasegruppen (dk.edb.database) hvordan man kan bygge en
fornuftig database op.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søren G. Andersen (11-08-2004)
Kommentar
Fra : Søren G. Andersen


Dato : 11-08-04 15:13

> Det er umiddelbart ikke nogen god ide. Har du overvejet om din
> datastruktur skal forbedres?

Det kan jeg desværre ikke... Min arbejdsgiver insisterer på at
rækkefølgen af div. produkter er yderst specifik. Og idet man ikke
kan sortere på nogen måde der giver den rækkefølge han ønsker, så må
jeg sidde og pille i DB hele tiden, og rykker poster frem og
tilbage...

Når jeg har underinddelt dem i tabeller som jeg har her, så er det
lige til at have styr på, men ellers er der simpelthen ALT for
mange...

> Gem WHERE-delen til efter sidste select (den vil stadig virke på
> hele forespørgslen). Det bør drastisk forbedre ydelsen på
> forespørgslen.

Nej, for så selecter den ALT fra ALLE, undtagen den sidste... Mit
problem var at jeg manglede en WHERE øverst...

> Samtidig er LIKE '%...%' en tung operation, fordi det er umuligt
at
> bruge indeks.

Hvad foreslår du så? Der søges i et notatfelt, eller såvel tekst som
tal.

> Det er nok bare forespørgslen der tager laaaang tid.

Jeps, det var det.

Mvh.

Søren

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jens Gyldenkærne Cla~ (11-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-08-04 15:43

Søren G. Andersen skrev:

> Det kan jeg desværre ikke... Min arbejdsgiver insisterer på at
> rækkefølgen af div. produkter er yderst specifik. Og idet man
> ikke kan sortere på nogen måde der giver den rækkefølge han
> ønsker, så må jeg sidde og pille i DB hele tiden, og rykker
> poster frem og tilbage...

Brug et talfelt til at angive sorteringsorden. Det virker
glimrende.

Jeg bruger det fx i en artikelTabel:

Artikler:
   artikelID
   kategoriID
   forfatterID
   overskrift
   ...
   sortvalue



> Når jeg har underinddelt dem i tabeller som jeg har her, så er
> det lige til at have styr på, men ellers er der simpelthen ALT
> for mange...

Du kan også snildt have et sorteringsfelt i kategoritabellen. Her
er et forslag til hvordan du kunne lave opbygningen med to
tabeller:

Kategorier:
   kategoriID
   kNavn
   kBeskrivelse
   kSortvalue

Produkter:
   produktID
   kategoriID
   pNavn
   pBeskrivelse
   pBillede
   pSortvalue


Et udtræk kunne så se ud som følger:

   SELECT kNavn, pNavn, pBeskrivelse, pBillede
   FROM Kategorier k INNER JOIN Produkter p
       ON k.kategoriID = p.kategoriID
   ORDER BY k.kSortvalue, p.pSortvalue



> Nej, for så selecter den ALT fra ALLE, undtagen den sidste...
> Mit problem var at jeg manglede en WHERE øverst...

Du har ret - det er kun order by der virker hele vejen gennem en
union.

Men man kan bruge subselect til smide where-delen udenfor:

Her er en tilsvarende union:

select * from
(
select linknavn, billede from billedkopiering
union all
select pic, nytnavn from billednavne
) as foo
where linknavn = 'foobar'


Jeg vil tro at det vil være hurtigere at nøjes med ét tablescan
(altså én where-sætning) i stedet for at køre where på hver enkelt
tabel, men jeg er ikke helt sikker.



>> Samtidig er LIKE '%...%' en tung operation,

> Hvad foreslår du så? Der søges i et notatfelt, eller såvel
> tekst som tal.

Nogle databasesystemer tilbyder fuldtekstindeksering - men det er
ikke muligt med Access SVJV. Der er ikke rigtig noget alternativ
til LIKE - hvis man altså har brug for wildcardsøgning. Kan man
nøjes med LIKE 'foo%' eller evt. = 'foo', vil det kunne køre langt
hurtigere.

Men stadigvæk vil jeg mene at du har et problem med datastrukturen.
Det kører måske fint nu, men hvis du skal have mange poster eller
mange brugere på sitet, er performance vigtigt at tænke på.

Præcis hvad "mange poster" hhv. "mange brugere" dækker over er
svært at sige, men hvis du allerede nu har sider (søgninger) der
tager mærkbar tid at vise, så vil en optimering være en rigtig god
ide.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søren G. Andersen (11-08-2004)
Kommentar
Fra : Søren G. Andersen


Dato : 11-08-04 13:02

Fandt problemet...

Havde glemt en WHERE i første linie... :S

Hvor dum kan man være...

Mvh.

Søren

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste