Avatar billede kroger Nybegynder
14. august 2001 - 00:23 Der er 33 kommentarer og
1 løsning

Data fra flere tabeller

Er der nogen der ved hvor man kan få et script, der gør sådan, at ved en søgning bliver der søgt i flere tabeller og herefter listes resultaterne \"tabel opdelt\". Jeg kan godt finde ud af at gøre det ved at åbne & lukke databasen en million gange, men det er jo ikke ligefrem ressource venligt.. Jeg kan regne mig frem til at jeg skal bruge nogle arrays og den slags sjov, men jeg er efterhånden fuldstændig blank for ideer.

På forhånd tak.
Danny
Avatar billede tmceu Praktikant
14. august 2001 - 00:55 #1
Først og fremmest kræver det at du bruger en rigtig database, der kan returnere multiple recordsets (ikke Access).

Hvis du eks. returnerer 2 recordsets med flg. SQL

strSQL = \"SELECT * FROM PRODUCT;\"
strSQL = strSQL & \"SELECT * FROM CUSTOMERS\"

kan du loop\'e igennem dem med nedenstående

Do Until objRS Is Nothing
  Do While Not objRS.EOF
      -- kode pr. record --
      objRS.MoveNext
  Loop
  Set objRS = objRS.NextRecordset
Loop
Avatar billede webbe Nybegynder
14. august 2001 - 09:05 #2
Prøv med

sql = \"SELECT * FROM table1,table2 WHERE (table1.id=table2.id)\"
Connect.Execute(sql)

Jeg bruger den ofte når jeg skal finde poster der har relation til hinanden - også på ACCESS DB\'er, men mest Oracle!
Avatar billede tmceu Praktikant
14. august 2001 - 17:10 #3
webbe >> jeg vil ikke påstå at din løsning ikke virker, men jeg mener der er nogle åbenløse begrænsninger med den, som spørgeren bør være opmærksom på.

1. Virker kun på relaterede tabeller
- og vil dermed eks. ikke vise poster fra tabel1, der ikke har et matchende post i tabel2
2. Returnerer data i ét stort recordset, hvilket gør det svært at vise data tabelopdelt
Avatar billede webbe Nybegynder
14. august 2001 - 17:16 #4
tmceu:

Det har jeg sq ikke problemer med!

Det er vel egentlig også det der er meninge som jeg forstår spørgsmålet!?
I Access er det jo ikke hensigtsmæssigt med tabeller med mange felter/kolonner, som man fx. kan i Oracle!
Derfor vil man have brug for flere tabeller med oplysnigner om fx. én post, hvor der er et fælles id/nøgle-felt!
Avatar billede sth Novice
14. august 2001 - 20:42 #5
Når jeg har brug for at søge i flere tabeller bruger jeg den kode som jeg gav som svar på spørgsmål:
http://www.eksperten.dk/spm/97852

Her kan du søge i lige så mange tabeller du har lyst:)
Avatar billede kroger Nybegynder
14. august 2001 - 21:04 #6
Tmceu >> da jeg prøvede den fik jeg at vide at objektet eller handlingen ikke undestøttede \"Set objRS = objRS.NextRecordset\". Til oplysning bruger jeg MSSQL til database. Webbe>> det er ikke tabeller med relation til hinanden jeg skal bruge, men til gengæld bare søgning i flere. Det jeg helt præcist skal bruge det til er at jeg har 5ca. 40 tabeller som en søgefunktion så skal tjekke igennem og så vise resultaterne fra hver tabellerne hver for sig. Tabellerne er bygget fuldstændig ens op, men indholdet er vidt forskelligt, og skal ikke sammenføres på nogen måde. Og sth, når prøver at bruge din funktion (som ellers var min første ide) får jeg at vide at ID´en kan  refere til flere tabeller(id er et felt i databasen). Håber dette præcisere mit mål lidt mere..
Avatar billede tmceu Praktikant
14. august 2001 - 23:57 #7
Hmm, ja det virker jo her, men har et par ideer.

Der er nogle bugs omkring nextrecordset i MDAC 2.1 som er rettet i MDAC 2.5
Server-side cursors og ODBC kan også være årsagen
Hvis dit recordset er disconnected - se evt. http://support.microsoft.com/support/kb/articles/Q193/3/52.ASP

Avatar billede tmceu Praktikant
15. august 2001 - 03:21 #8
Jeg kom til at tænke lidt mere over dit spørgsmål og har et forslag: Hvis du ønsker at gøre din søgning total dynamisk til at søge i eks. alle usertables, kan du bruge noget i stil med nedenstående:

Returner alle usertables med \"select * from sysobjects where OBJECTPROPERTY(id, N\'IsUserTable\') = 1\"

Loop igennem posterne og dan et SQL statement hvor alle tabeller er inkluderet (\"SELECT * FROM Tabel1;SELECT * FROM Tabel2.....\")

Brug koden fra tidligere til at vise resultatet for alle tabellerne

Do Until objRS Is Nothing
  Do While Not objRS.EOF
      -- kode pr. record --
      objRS.MoveNext
  Loop
  Set objRS = objRS.NextRecordset
Loop

Hvis du ønsker at søge i alle tables, er dette totalt vedligeholdelses frit, da alle nye tabeller aut. er inkluderet i søgningen.

Jeg har lige lavet en lille test og det virker perfekt.

P.S. Kan ikke huske om der er en begrænsning på længden af SQL statement, dette kan i så fald være et problem, da det godt kan blive langt.
Avatar billede kroger Nybegynder
17. august 2001 - 20:52 #9
TMCEU>> Jeg har prøvet dine ting nu, og er kommet så langt at jeg har fået en ny fejlmeddelelse(Juhuu!!), den siger \"Ambiguous column name \'navn\'\", (Ambiguous = tvetydig) hvilket jo må mene at den brokker sig over at søge i 2 tabeller, eller hvad?
Avatar billede kroger Nybegynder
17. august 2001 - 20:54 #10
Jeg beklager at jeg ikke har svaret på tingene de sidste 2 dage, men jeg har haft så stjerne travlt på arbejdet at jeg ikke har haft tid.
Avatar billede tmceu Praktikant
17. august 2001 - 23:20 #11
Det betyder at du har min. 2 tabeller hvor det samme feltnavn indgår (sandsynligvis i WHERE delen). Hvis du eks. laver nedenstående vil du få den fejl:

Et par fiktive tabeller

Tabel1: Navn, Adresse
Tabel2: Navn, kategori

Select * From Tabel1 inner join Tabel2 on Tabel1.Navn = Tabel2.Navn where Navn = \"Julemanden\"

I disse tilfælde, er du derfor nødt til at referere til et felt eksplicit:

Select * From Tabel1 inner join Tabel2 on Tabel1.Navn = Tabel2.Navn where Tabel1.Navn = \"Julemanden\"

Du kan også bruge et alias for tabellerne, så du ikke hele tiden skal skrive lange tabelnavne foran:

Select * From Tabel1 as T1 inner join Tabel2 as T2 on Tabel1.Navn = Tabel2.Navn where T1.Navn = \"Julemanden\"

Håber det hjælper dig videre, om ikke andet så til en ny fejlmeddelelse :-)



Avatar billede kroger Nybegynder
21. august 2001 - 20:16 #12
Jamen så får jeg jo ikke delt resultaterne op afhængigt af hvilken tabel de kommer fra. Og til information så har du ret med med feltnavn, som nævnt tidligere er alle tabeller bygget ens op, med kolonne-navne og alting, det er indholdet i kolonnerene der forskellig.
Avatar billede tmceu Praktikant
21. august 2001 - 22:13 #13
Jeg tror vi taler lidt forbi hinanden. Mit sidste svar var kun et eksempel for at vise hvad der kan være årsagen til at du får fejlen \"Ambiguous column name \'navn\'\". Jeg har forstået at du skal have tabellerne behandlet seperat, og det er det denne kode gør:

Do Until objRS Is Nothing
  Do While Not objRS.EOF
      -- kode pr. record --
      objRS.MoveNext
  Loop
  Set objRS = objRS.NextRecordset
Loop

For at få flere seperate recordsets tilbage, skal du opbygge dit SQL statement som herunder, adskilt med semikolon.

SELECT * FROM Tabel1;SELECT * FROM Tabel2.....\")

Vis evt. den kode hvor fejlen opstår.
Avatar billede kroger Nybegynder
21. august 2001 - 23:12 #14
Det er fedt du gider hjælpe så meget, det er jeg meget taknemmelig overfor, nå men her er fejl-koden:
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name \'navn\'.
/hobo/search/source195/search.asp, line 56

Og her asp koden:
\' Opbygger en dynamisk SQL streng
strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\"
strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"

\' Databaseforbindelse Set Conn = Server.CreateObject(\"ADODB.Connection\")
DSN = \"DSN=asp;Database=test;\"
DSN = DSN  & \"UID=test;PWD=test;\"
Conn.Open DSN

Set rs = Conn.Execute(strSQL)

Do Until rs Is Nothing
Do While Not rs.EOF

Navn = rs(\"navn\")
Besked = rs(\"by\")

\' laver linket
Link = \"<b><a href=\" & Navn & \" target=\'new\'>\" & Navn & \"</a></b>\"

\' tekst der vises
Response.Write \"<li>\" & Link & \"</li>\" & \" - \" & Besked

rs.MoveNext
Loop

Set rs = rs.NextRecordset
Loop

\' Databaseforbindelsen lukkes
Conn.Close
Set Conn = Nothing
Avatar billede kroger Nybegynder
21. august 2001 - 23:13 #15
Ups, du skal slevfølgelig ikke indregne email & website i select...
Avatar billede tmceu Praktikant
21. august 2001 - 23:19 #16
Jeg tror fejlen ligger her:

strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\"
strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"

den kan ikke finde ud af om du mener hhv. navn og by1 i tabellen ba eller bb! Hvis du virkelig vil have dit statement opbygget som ovenstående, skal du rette det lidt til:

strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\"
strSQL = strSQL & \" (ba.navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (ba.by1 LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (bb.navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (bb.by1 LIKE \'%\" & strKeyword & \"%\')\"
Avatar billede kroger Nybegynder
21. august 2001 - 23:24 #17
Jeg prøvede det og det er desværre ikke det, den kommer med præcis den samme fejl igen..
Avatar billede kroger Nybegynder
21. august 2001 - 23:28 #18
grunden til at jeg ikke har lavet select´en som din er at den så kun tog Where delen med på den sidste select, og det vil blive lidt tungt, hvis jeg skal skrive en where for hver tabel...Du ved dovenskab er en programmørs dyd;)
Avatar billede tmceu Praktikant
21. august 2001 - 23:28 #19
Undskyld, der er lige endnu en fejl. Den har samme problem med SELECT delen: SELECT navn, email, website, by1 ... den ved ikke om du mener navn fra ba eller bb tabellen. Skal rettes til:

strSQL = \"SELECT ba.navn, ba.email, ba.website, ba.by1, bb.navn, bb.email, bb.website, bb.by1 FROM ba, bb WHERE\"
strSQL = strSQL & \" (ba.navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (ba.by1 LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (bb.navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (bb.by1 LIKE \'%\" & strKeyword & \"%\')\"

Men nu begynder dit SQL statement at blive uoverskueligt, ikke ?
Avatar billede kroger Nybegynder
21. august 2001 - 23:34 #20
hæhæ...du har lidt ret, især hvis jeg fortæller dig at den skal søge i ca. 45 tabeller.... Så jeg tænkte på om der ikke findes en 8. måde at lave den på?, men jeg prøver lige denne her så vi kan få fundet fejlen.
Avatar billede kroger Nybegynder
21. august 2001 - 23:37 #21
nu får jeg denne fejlmeddelelse istedet:
Elementet kan ikke findes i den samling, der svarer til det anmodede navn eller ordenstal.
/hobo/search/source195/search.asp, line 65


Hvor linje 65 er:
Navn = rs(\"navn\")
Jeg prøvede at skrive rs(\"ba.navn\"), men det hjalp ikke
Avatar billede tmceu Praktikant
21. august 2001 - 23:37 #22
Venter på din konklusion :-)
Avatar billede kroger Nybegynder
21. august 2001 - 23:39 #23
Spørgsmålet er om det betyder noget for ydelsen, for hvis det ikke gør må jeg jo bare skrive den kilometerlange statement.
?
Avatar billede tmceu Praktikant
21. august 2001 - 23:42 #24
Hvilken database anvender du ?
Avatar billede tmceu Praktikant
21. august 2001 - 23:45 #25
UPS! Du bruger MS SQL, et øjeblik...
Avatar billede kroger Nybegynder
21. august 2001 - 23:45 #26
SQL, MSSQL server 7.0

Her har jeg så oprettet en database til formålet (test) der indeholder de 2 tabeller (ba & bb) med lidt testfyld i.
Avatar billede tmceu Praktikant
21. august 2001 - 23:56 #27
Kig lidt på nedenstående eksempel:

Dim arrNames(3)    \' definerer et array med 4 elementer
arrNames(0) = \"ba\"
arrNames(1) = \"bb\"
arrNames(2) = \"bc\"
arrNames(3) = \"bd\"

For i = LBound(arrNames) To UBound(arrNames)

strSQL = strSQL & \"SELECT navn, email, website, by1 FROM \" & arrNames(i)  & \" WHERE\"
strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\');\"

Next

Dette vil dynamisk opbygge en SQL sætning for dig, med alle de tabeller du smider i array\'et (nemt at udvide)

SELECT navn, email, website, by1 FROM ba WHERE (navn LIKE \'%ord%\') OR (by1 like \'%ord%\');SELECT navn, email, website, by1 FROM bb WHERE (navn LIKE \'%ord%\') OR (by1 like \'%ord%\');......

og så får du alle tabeller tilbage som seperate recordsets

Hvis du ikke har mod på det, sker der ikke noget ved at lave den kilometerlange :-)
Avatar billede kroger Nybegynder
22. august 2001 - 00:14 #28
Nu har lige prøvet din kode, men den går kun og tjekker \"bb\" (jeg gik ind og skar dit array ned til ba & bb), jeg fik den til at skrive strSQL ud og det blev til:
SELECT navn, by1 FROM bb WHERE (navn LIKE \'%a%\') OR (by1 LIKE \'%a%\')

Array koden er:
Dim arrNames(1)    \' definerer et array med 4 elementer
arrNames(0) = \"ba\"
arrNames(1) = \"bb\"

For i = LBound(arrNames) To UBound(arrNames)

\' Opbygger en dynamisk SQL streng
strSQL = \"SELECT navn, by1 FROM \" & arrNames(i) & \" WHERE\"
strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"

next

Response.Write strSQL
Avatar billede kroger Nybegynder
22. august 2001 - 00:17 #29
Ellers virker den fanlatastisk:)
Avatar billede tmceu Praktikant
22. august 2001 - 00:19 #30
Du har ikke kopieret den første linie korrekt, det skal være

strSQL = strSQL & \"SELECT navn, email, website, by1 FROM \" & arrNames(i)  & \" WHERE\"

- som jeg skrev :-)
Avatar billede tmceu Praktikant
22. august 2001 - 00:21 #31
og det samme med sidste linie, du mangler et semikolon i enden, til at adskille dine SQL statements

strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\');\"

Avatar billede kroger Nybegynder
22. august 2001 - 00:26 #32
Du er en skat tmceu:) Mange tak for din tålmodige til en grøn ASP-aspirant
Avatar billede kroger Nybegynder
22. august 2001 - 00:27 #33
øhh... tålmodighed:)
Avatar billede tmceu Praktikant
22. august 2001 - 00:29 #34
Det var så lidt, fortsat held og lykke og godnat zzzZZZ
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

IT-JOB

Politiets Efterretningstjeneste

GenAI-specialist i PET

Capgemini Danmark A/S

Client Partner

Politiets Efterretningstjeneste

Sektionsleder til dataplatform i PET