24. maj 2004 - 13:37Der 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
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"
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.
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"
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?
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)?
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
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"
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å
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.