Avatar billede jens_k Nybegynder
24. maj 2004 - 13:37 Der er 12 kommentarer og
2 løsninger

SQL Query med JOIN

Hej

Jeg har en SQL Query som virker fint på min Access Database, men nu skal jeg altså bruge den på en Oracle 8 database, og der virker den ikke. Den ser således ud :

SQL = "SELECT * FROM LagVariantPost where DATASET='" & Session("DataSet") & "' AND VareNummer='" & intVareNummer & "' AND WebStatus='1' join LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant ORDER BY LagVariantVXRDI.Sortering"

Det er dette stykke kode som gør det ikke virer :
join LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant ORDER BY LagVariantVXRDI.Sortering


Nogen som kan hjælpe ?

Mvh

Jens K
Avatar billede ldanielsen Nybegynder
24. maj 2004 - 13:46 #1
SQL = "SELECT * FROM LagVariantPost
INNER JOIN LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant
WHERE DATASET='" & Session("DataSet") & "' AND VareNummer='" & intVareNummer & "' AND WebStatus='1' ORDER BY LagVariantVXRDI.Sortering"
Avatar billede ldanielsen Nybegynder
24. maj 2004 - 13:52 #2
Den korrekte form er

SELECT ..... FROM ..... WHERE .... ORDER BY ....


Join'et skal altså stå mellem FROM og WHERE. Det undrer mig meget at det overhovedet har virket. Du skal nok lige checkke at det stadig returnerer det du forventer, og så i øvrigt rette fejlen i Access også.

Access er som meget andet Microsoft software tolerant overfor fejl, hvilket er meget farligt. Du tror at du ved hvad der foregår, og så foregår der noget helt andet.
Avatar billede jens_k Nybegynder
24. maj 2004 - 15:06 #3
Jeg får følgende fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Oracle][ODBC][Ora]ORA-00933: SQL-kommando er ikke korrekt afsluttet
Avatar billede jens_k Nybegynder
24. maj 2004 - 15:06 #4
Og det er den linie hvor der står:

SQL = "SELECT * FROM LagVariantPost INNER JOIN LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant WHERE DATASET='" & Session("DataSet") & "' AND VareNummer='" & intVareNummer & "' AND WebStatus='1' ORDER BY LagVariantVXRDI.Sortering"
Avatar billede ldanielsen Nybegynder
25. maj 2004 - 19:49 #5
Kan du ikke udskrive sqlsætningen i sin helhed? Det vil sige som den faktisk bliver efter at variablerne er sat ind:

Response.Write (SQL)

- hvis det er ASP vi taler om.

Det er jo databasen der brokker sig over inputtet, så det er en god ide at se præcis hvad det er den får.

Check også efter om datatyperne kan være problemet. De felter som skal join'es, dvs. LagVariantPost.Variant2 og LagVariantVXRDI.Variant skal være samme datatype.

I øvrigt undrer det mig at du bruger anførselstegn omkring alle værdierne, er der ikke nogen af dem der er tal?
Avatar billede ldanielsen Nybegynder
25. maj 2004 - 19:53 #6
DATASET, VareNummer og WebStatus, de tre felter du bruger i din WHERE-clause, er deres navne unikke for de to tabeller? Ellers skal du skrive LagVariantPost.DATASET osv.

Jeg kender ikke Oracle, forstår den "*"? (Prøv evt. at sige SELECT VareNummer, Webstatus ... i stedet)?
Avatar billede jens_k Nybegynder
25. maj 2004 - 23:06 #7
Oracle forstår godt *. Det virker fint når jeg ikke bruger JOIN, men jeg er nødt til at bruge JOIN for at få størrelserne ud i den rigtige rækkefølge.

DataTyperne er de samme. Det har jeg tjekket.

Min SQL ser nu således ud :

SQL = "SELECT * FROM LagVariantPost INNER JOIN LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant WHERE LagVariantPost.DATASET='" & Session("DataSet") & "' AND LagVariantPost.VareNummer='" & intVareNummer & "' AND LagVariantPost.WebStatus='1' ORDER BY LagVariantVXRDI.Sortering"


Og giver dette resultat (Når jeg bruger Response.Write SQL):

SELECT * FROM LagVariantPost INNER JOIN LagVariantVXRDI on LagVariantPost.Variant2 = LagVariantVXRDI.Variant WHERE LagVariantPost.DATASET='DAT' AND LagVariantPost.VareNummer='4114011' AND LagVariantPost.WebStatus='1' ORDER BY LagVariantVXRDI.Sortering
Avatar billede ldanielsen Nybegynder
26. maj 2004 - 09:51 #8
OK, så slog jeg lige op i Oracles online reference. Jeg tror du skal prøve at join'e med kommaer:

SQL = "SELECT * FROM LagVariantPost, LagVariantVXRDI WHERE LagVariantPost.Variant2 = LagVariantVXRDI.Variant AND LagVariantPost.DATASET='" & Session("DataSet") & "' AND LagVariantPost.VareNummer='" & intVareNummer & "' AND LagVariantPost.WebStatus='1' ORDER BY LagVariantVXRDI.Sortering"
Avatar billede jens_k Nybegynder
26. maj 2004 - 12:32 #9
Ok, nu kommer der ikke nogen fejl længere..

Men hvis jeg kører mit recordset igennem. Altså : (do while not rs.eof)

Så får jeg lige pludselig rigtig mange poster, istedet for de 6 som burde. Den samme post optræder rigtig mange gange.

Skal jeg lave noget bestemt ved min løkke ?

Mvh

Jens.
Avatar billede ldanielsen Nybegynder
27. maj 2004 - 14:49 #10
det kunne du gøre, eller brug GROUP BY
Avatar billede jens_k Nybegynder
01. juni 2004 - 14:19 #11
Og hvordan fungere GROUP BY ?
Avatar billede ldanielsen Nybegynder
02. juni 2004 - 20:16 #12
Tja:

SQL = "SELECT felt1, felt2, felt3 FROM LagVariantPost, LagVariantVXRDI WHERE LagVariantPost.Variant2 = LagVariantVXRDI.Variant AND LagVariantPost.DATASET='" & Session("DataSet") & "' AND LagVariantPost.VareNummer='" & intVareNummer & "' AND LagVariantPost.WebStatus='1' GROUP BY felt1, felt2, felt3 ORDER BY LagVariantVXRDI.Sortering"

Bemærk at jeg nu kun select'er tre felter, og det skal selvfølgelig være tre af dem der ikke varierer. Det er blot et eksempel, du skal select'e de felter du har brug for, og kun dem. De samme felter skal indgå i group by, ellers får du en fejl.

Udover de felter du vælger at gruppere efter kan du select'e SUM(felt4), MAX(felt4) osv, det man kalder "Aggregate functons"

Alt dette gælder for MS SQL, men burde kunne bruges med Oracle også
Avatar billede jens_k Nybegynder
17. september 2004 - 20:02 #13
Tak for hjælpen

Fik det dog ikke til at virke, men synes du skal have pointene for din indsats :-)

Mvh

Jens K
Avatar billede ldanielsen Nybegynder
22. september 2004 - 14:18 #14
tak for det
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
Computerworld tilbyder specialiserede kurser i database-management

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