29. april 2002 - 17:54Der er
38 kommentarer og 1 løsning
Joine databaser
Er der en som kan hjælpe mig med nedenstående script. Som det er nu, kører det en forespørgsel på tabellen "biler". Jeg vil gerne have det lavet om, så det kører en forespørgsel på 4 tabeller, - lad os kalde dem "Opel", "Toyota", "Ford" og "Mazda". Tabellerne skal altså joines, men jeg ved ikke lige hvordan man skriver det ind i scriptet!
' Opbygger en dynamisk SQL streng strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler FROM biler WHERE" strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')" strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')" strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')" strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")" strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")" strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') ORDER BY Bilmaerke, Model"
' Skaber DSN forbindelse til DBen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "DSN=riishojwebsoftdkdsn"
' Skaber et recordset udfra SQL strengen Set rs = myConn.Execute(strSQL) If Not (rs.BOF Or rs.EOF) Then ' Hvis der er fundet poster på søgningen Response.Write "<h4 align=center><font face=Verdana>Her er resultatet af din søgning</font></h4><hr><br>" Response.Write "<table border=0>"
rs.MoveNext Loop Response.Write "</table>" Else ' Hvis der ikke er fundet poster på søgningen Response.Write "<p>Der er ikke fundet noget på denne søgning</p>" End If
' Rydder op efter os myConn.Close Set myConn = Nothing %>
Brug af AI afslører de svagheder, virksomheder allerede har opbygget gennem års cloud-transformation, nye SaaS-løsninger og fragmenterede sikkerhedssystemer.
strSQL = "SELECT b.ID, b.Bilmaerke, b.Model, b.Aargang, b.Km , b.Pris , b.Forhandler FROM (( biler b inner join mazda m ON b.bilmaerke=m.ID ) inner join tbl_opel o ON b.bilmaerke=o.ID )" strSQL = strSQL & " WHERE (b.Bilmaerke LIKE '%" & strBilmaerke & "%') ORDER BY b.Bilmaerke, b.Model"
Øh, prøver lige at forklare. F.eks. skal Mazda-forhandleren kunne indtaste data i tabellen "Mazda" og Toyota-forhandleren indtaste data i tabellen "Toyota" Det vil derfor være en teoretisk mulighed, at begge kan indtaste et bilmærke, f.eks. en Toyota i hver sin tabel og at de to bilmærker så tilfældigt vil have samme ID. Hvad sker der så, når man joiner tabellerne?
Well, Jeg går ud fra der er tale om MSSql: Generelt tror jeg ikke jeg vil løse problemet på den måde du har gang i. Jeg synes den nuværende forespørgsel ser meget fornuftig ud, men altså:
Hvis du skal sætte 4 tabeller sammen på den måde jeg synes du forklarer det, så er der ikke tale om join, men om union. med union kan du sætte et antal forespørgsler sammen så det ser ud somom de var en forespørgsel ex:
select 'opel' as 'Bilmaerke', ID, Aargang, Km , P....... osv from opel where ......osv UNION select 'Nissan' as 'Bilmaerke', ID, Aargang, Km , P....... osv from Nissan where ......osv UNION osv.... Order by Bilmaerke, Model
Bemærk at i en union skal man have det samme antal felter i alle de forespørgsler der bliver sat sammen.
Når du forespørger på den måde er en bil ikke unik på dens ID, men på Bilmærke OG ID. Så selv om 3 biler har samme ID, kan du præcis angive hvilken der er tale om da du også har adgang til Bilmærke.
Under følgende forudsætninger ER Bilmaerke og ID unikt: Hver biltabel (f.eks. toyota) har ID som unikt felt (identityfield....) du navngiver 'Bilmaerke' efter tabellen
Ellers vil jeg gerne høre hvordan det kan lade sig gøre at de ikke er... ogå teoretisk :-)) Jeg kan stadig ikke forstå hvorfor du vil lave 4(and counting...) tabeller med Bil-mærker. De ting du udsøger her ser rimelig fælles ud for alle biler..... Man kunne vel bare lave bilmærket om til et numerisk BilMaerkeID, og så JOINE den med en ny tabel kaldet BilMaerke. Det er så simpelt som:
SELECT ID, BM.Bilmaerke, Model, Aargang, Km , Pris , Forhandler FROM biler inner join BilMaerke as BM on biler.BilmaerkeId = BM.BilmaerkeId Where..... osvosvosv and..and... and BM.Bilmaerke LIKE '%ford%'
Og jeg synes det ser ud til at du får det samme ud af det som i den anden.... bortset fra at når du skla oprettet nye bilmærker, er det i denne løsning 'bare' at indsætte en ny entry i BilMaerker.. /Jesper
Hmm. Nu er jeg altså blevet forvirret. Jeg prøver lige at rekapitulere, hvis i stadig gider at hænge på. Jeg har i en Access-database lavet en tabel kaldet "biler" Til denne tabel har jeg lavet scripts, som kan indsætte, slette og opdatere data i tabellen. Desuden har jeg et script, som gør det muligt at søge i tabellen. Dette script er hele kernen i systemet, altså at man skal kunne gå ind og søge på et bilmærke, model, pris etc. De forhandlere, som tilslutter sig databasen skal kunne gå ind og indsætte, slette og opdatere data, men da man ikke skal kunne slette andres biler, vil jeg ikke nøjes med 1 tabel med 4 tabeller (forudsat at der er 4 brugere=forhandlere). Når der så køres en forespørgsel fra søgesiden, skal denne søge i alle fire tabeller. Derfor troede jeg, at det kunne klares med at joine disse i søgningen.
Tror du så ikke løsningen er at have et felt der siger noget om hvad det er for en forhandler der 'ejer' en post i databasen i stedet, og så kun lade en forhandler der 'ejer' en post slette og editere i det :-)
Her kommer de skridt du skal igennem: 1) opret en tabel kaldet forhandler med forhandlerId, navn, udername, pass (så de kan logge på... mon ikke du har det et andet sted i systemet??) 2) fyld tabellen op med de forhandlere der er i systemet (eller genbrug en gammel tabel hvis den allerede eksisterer) 3) opret et nummerisk felt i biler kaldet ForhandlerId 4) Opdater ForhandlerId i biler så det passer med forhandlernes IDer 5) Nu er du i stand til KUN at vise f.eks. forhandler med forhandlerID=3's biler til ham!
Når du for eftertiden opretter biler skal du sørge for at have ForhandlerIDen med.
Når nu forhandlernavnet er blevet lagt over i en anden tabel, men har et fælles felt (forhandlerID), kan man bruge en join. Den ser så ud som flg hvis du vil vise forhandler 3's biler:
SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3
OK. Jeg tror, at jeg har fattet det meste. Kan vi vende tilbage i morgen aften, så jeg har haft tid til at lave og teste dit forslag? Foreløbig mange tak for hjælpen :)
Jeg har prøvet at arbejde med dit forslag. Desværre virker det ikke! Scriptet ser sådan ud
<% Response.Buffer = True %> <html><head> <title>Søgeresultat</title> </head><body> <center> <% ' Skaber DSN forbindelse til DBen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "DSN=riishojwebsoftdkdsn"
' SQL forespørgsel SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3 ' Skaber et recordset udfra SQL strengen Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then ' Hvis der er fundet poster på søgningen Response.Write "<h4 align=center><font face=Verdana>Her er resultatet af din søgning</font></h4><hr><br>" Response.Write "<table border=0>"
rs.MoveNext Loop Response.Write "</table>" Else ' Hvis der ikke er fundet poster på søgningen Response.Write "<p>Der er ikke fundet noget på denne søgning</p>" End If
' Rydder op efter os myConn.Close Set myConn = Nothing %>
</center>
</body>
</html>
Jeg har lavet de ændringer og tilføjelser i tabellerne, som du beskrev. Kan du finde fejlen(ene)?
Øh, jeg glemte at vise fejlmeddelelsen. Den kommer her!
Microsoft VBScript compilation error '800a03fd'
Expected 'Case'
/Biler_paa_Vestfyn/id3.asp, line 13
SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3 -------^
Hm - Det du foreslår er jo et script med en dynamisk SQL streng. Min udgave ovenover skulle være et eksempel på hvad forhandleren med id=3 for ud af sin forespørgsel.
aarggh sorry!! Er ved at tabe focus :-) Pointen var at du i dit sidste eksempel skriver ----- ' SQL forespørgsel SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3 ' Skaber et recordset udfra SQL strengen Set rs = myConn.Execute(strSQL) ---- Men... hvor er strSQL ;-) Mon ikke der skulle stå ---- ' SQL forespørgsel strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler " & _ "FROM biler inner join forhandler as for " & _ "on biler.ForhandlerId = for.forhandlerId " & _ "WHERE for.forhandlerId = 3" ' Skaber et recordset udfra SQL strengen Set rs = myConn.Execute(strSQL)
SQLState: S1000 Native Error Code: -3007 [INTERSOLV][ODBC SequeLink driver][ACCESS][Microsoft][ODBC Microsoft Access Driver] The specified field 'ID' could refer to more than one table listed in the FROM clause of your SQL statement.
/Biler_paa_Vestfyn/id3.asp, line 17
Er det fordi jeg har feltnavnet ID i både "biler" tabellen og i "forhandler"
Grunden er at jeg gerne vil kunne bruge
strSQL = "Delete from biler where Id = " & replace(request.form("RecordToDelete"),"'","''") Conn.Execute(strSQL)
Der er lige det det er :-)) Så hvis den ID du er interesseret i at få ud er den fra Bilerne skal man angive det ved at sætte biler foran i joinen så den ikke er i tvivl: strSQL = "SELECT biler.ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler " & _ "FROM biler inner join forhandler as for " & _ "on biler.ForhandlerId = for.forhandlerId " & _ "WHERE for.forhandlerId = 3"
Den eneste forskel fra deroppe hvor den kom med Native Error Code: -3007 er at der er sat et "biler." foran ID!!! Det kan den altså ikke begynde at bitche med en "Invalid character" over!
ligger den .asp og .mdb tilgængeligt et eller andet sted?
Synes godt om
Slettet bruger
30. april 2002 - 22:27#35
riis > Hvorfor vil du lave seperat tabel til hvert bilmærke? Det er da smartere at bruge dit første udgangspunkt med en tabel til biler, og så tilføje et felt "bilmærke" ?!
just4fun> Jeg kunne evt. maile asp. og mdb. filerne til dig.
ezolu> Jeg vil heller ikke lave seperate tabeller til hvert bilmærke, men til hver forhandler. Det jeg forsøger at lave, er et system, så hver forhandler kan gå ind og opdatere deres egen tabel, men samtidig skal der kunne søges i alle tabellerne på en gang. Det var derfor, at jeg troede, at man kunne joine disse tabeller.
Lige inden jeg lukker. Jeg har en mistanke om, at min db på serveren ikke fungerer optimalt og at det muligvis giver fejlene. Checker med min udbyder i morgen.
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.