Just nu i M3-nätverket
Gå till innehåll

SQL-krångel igen


Dahlgren

Rekommendera Poster

Hej!

 

Jag håller på och gör en webbutik i ASP, nu är det så att jag i drop down-menyn hämtar in värden från en databas. Syftet med den menyn är att den ska visa alla varor man har i korgen. Problemet är att jag behöver hämta in data från två olika tabeller.

 

Såhär ser det ut:

 

strSQL = "SELECT * FROM tblTemp WHERE SESSION_ID = " & intSessionID & ""
objRS.Open strSQL, objConn, adOpenStatic, adLockOptimistic

While Not objRs.EOF
Response.Write("<option value='showsingle.asp?id=" & objRs("ARTIKEL_ID") & "'>" & objRs("ANTAL") & " st " & objRs("ARTIKEL_ID") & "")
objRs.MoveNext
Wend

 

Problemet är, som sagt, att där objRs("ARTIKEL_ID") skrivs ut, ska egentligen en post i en annan tabell väljas och namnet på artikeln med det artikelnummret ska skrivas ut. Kan jag öppna en till tabell varje gång loopen körs (resusrskrävande?). Lite svårt att förklara men hoppas ni kan tyda vad jag menar.

 

Det är tydligen inte helt enkelt det där att göra en webbutik :)

 

Tack på förhand, mvh.

 

 

Länk till kommentar
Dela på andra webbplatser

NoiseKiller

Dags å introducera dig för funktionen INNER JOIN. :)

Din sats:

strSQL = "SELECT * FROM tblTemp WHERE SESSION_ID = " & intSessionID & ""

 

Som den borde se ut (ungefär):

strSQL = "SELECT namn_tabell.namn_kolumnen, tblTemp.* FROM tblTemp INNER JOIN namn_tabell ON namn_tabell.ARTIKEL_ID = tblTemp.ARTIKEL_ID WHERE SESSION_ID = " & intSessionID & ""

Då plockar den med fältet namn_kolumnen från tabellen namn_tabell där ARTIKEL_ID är samma som i det du hämtar ur tblTemp.

 

Hänger du med?

 

[inlägget skrivet av NoiseKiller]

 

Länk till kommentar
Dela på andra webbplatser

Ja nu jäklar fungerar det :) Jag kan ju inte säga att jag förstår riktigt varför men det kan nog bero på att jag aldrig har använt INNER JOIN förut men jag tänkte läsa lite om det så klarnar det nog.

 

Tack så mycket för hjälpen.

 

Länk till kommentar
Dela på andra webbplatser

NoiseKiller

Jag ställde själv samma fråga som dig för bara några månader sedan (halvår?) - och det är inte svårare än att till och med jag kan lära mig. :thumbsup:

 

Vill du forska mer i LEFT-, RIGHT-, INNER- och OUTER-JOIN ska du kika här:

http://www.w3schools.com/sql/sql_join.asp

 

[inlägget skrivet av NoiseKiller]

 

Länk till kommentar
Dela på andra webbplatser

Ja, den s idan är bra, brukar kolla där ibland. Måste läsa på lite om det där så man lär sig ordentligt.

 

Länk till kommentar
Dela på andra webbplatser

Hur visste du att han körde SQL Server som databas? :)

Den satsen hade inte funkat i Oracle, där man slipper tragglet med att speca INNER JOIN ..

 

strSQL = "SELECT a.kolumnnamn, a.kolumn2namn, b.namn_artikel

FROM tblTemp a, tblArtikel b

WHERE a.session_id = "&intSessionID&" and a.artikelid = b.artikelid"

 

 

/Jenny *föredrar Oracle*

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Så kan man ju skriva även i SQL Server.

Men fördelen med att INTE använda den konstruktionen är att man använder sig av ANSI-standarden för joins.

Tror att Oracle i senare dialekter även stöder ANSI-joins.

Detta för att konstruktionen *= för outer joins inte stöds överhuvudtaget i ANSI:s SQL92-standard.

--

Snäll ibland. rättvis nästan jämt. Elak för det mesta.

 

Länk till kommentar
Dela på andra webbplatser

Har du ju också helt rätt i...*erkänner*

 

Faktum är att just OUTER JOINEN har gjort att jag tycker det är jobbigare att skriva sqlsatsen mot Sqlserver än mot Oracle..

 

Övrigt som jag stör mig över är att Sqlserver inte är casesensitive.. samt att (och det här behöver inte vara specifikt för annat än vår applikationsmiljö!!) man inte kan köra en sqlfråga och committa den om man ligger nästlad i en snurra inom ett annat recordset.. Då stannar hela databasen - för ALLA anslutna..

 

Pratar då om en windowsbaseradapplikation mot sqlserver.

 

Länk till kommentar
Dela på andra webbplatser

NoiseKiller
inte kan köra en sqlfråga och committa den om man ligger nästlad i en snurra inom ett annat recordset.. Då stannar hela databasen - för ALLA anslutna..
*fågelholk*

 

Så skönt å veta att jag lärt mig detta med INNER JOIN mm i onödan. Står nämligen inför döde.... oracle menar jag. Kommer inom en snar framtid konvertera ifrån SQL-server till Oracle. Nåt mer jag kommer få ändra? :/

 

[inlägget skrivet av NoiseKiller]

 

Länk till kommentar
Dela på andra webbplatser

Tja.. jag vet helt ärligt inte eftersom vi enbart skriver om outerjoindsatserna för sqlserverkunder...

 

Jag testade dock att köra följande:

SELECT tabell.namn, tabell2.namn FROM databas.kmatsedel INNER JOIN databas.kpart ON tabell.partid = tabell2.partid WHERE tabell.id = 55

 

i min SqlTalk som går mot en Oracle 8.1.7 databasserver

 

Det fungerande inte.....

 

Länk till kommentar
Dela på andra webbplatser

Per Björklund

Vad menar du med att SQL server inte är casesensitive? I SQL-frågorna eller i tabellnamn och sånt?

 

/ Per

 

Länk till kommentar
Dela på andra webbplatser

Alltså:

 

SQLsats:

SELECT * from tabell where namn = 'jenny'

 

ger i Oracle just bara de rader där namn är "jenny"

medan SqlServer levererar rader där namn är

* "JENNY"

* "jeNNy"

* "Jenny"

* "jenny"

 

...tja, du förstår säkert själv.

 

Länk till kommentar
Dela på andra webbplatser

Per Björklund

Nja, det där kan man ställa in i SQL server (åtminstonde i SQL Server 2000) antingen på databasnivå (när den skapas har jag för mig), eller på kolumnnivå (Via Enterprise manager går man in i "design" på tabellen och välj den kolumn man vill ändra och klicka på dom tre prickarna som kommer fram när man trycker på collation-radenoch där ställer man in Case sensitive)

 

/ Per

 

Länk till kommentar
Dela på andra webbplatser

Va synd, jag hade gärna sett att det gick att ställa in, då slipper vi göra specialfunktioner vid t ex inloggningsfunktioner för att kontrollera varje tecken för sig.

 

/J

 

Länk till kommentar
Dela på andra webbplatser

Per Björklund

Fast nu måste jag rätta mig själv en gång till.. ;)...

 

Jag testade att ställa om Sort order på en kolumn i en tabell och vips blev den case sensitive även vid sql-frågor!.. Så det går visst att få SQL server case sensitive...

 

/ Per

 

Länk till kommentar
Dela på andra webbplatser

Från och med SQLServer 2000 så går det att ställa på såväl tabell som på fältnivå (i 7:an var det av nån outgrundlig anledning nåt som gällde hela databasen (alla tabeller).

 

 

Länk till kommentar
Dela på andra webbplatser

Nu har jag letat efter inställningsmöjligheten på befintlig Sqlserver databas, men tyvärr utan resultat.

 

Var skulle jag hitta dessa inställningarna sa ni?

 

/Jenny

 

Länk till kommentar
Dela på andra webbplatser

Per Björklund

Om du öppnar Enterprise manager och sedan går in i databasen och klickar med höger musknapp på den tabell du vill modifiera och väljer "Design Table". Klicka sedan på den kolumn du vill göra case sensitive. Då dyker alternativen upp under kolumnerna (Description, Default Value, Precision osv osv..). Längst ner har du ett val som heter "collation".

Klicka i det fältet (där det troligen står <database default>). Då dyker det upp en liten knapp med tre prickar på, klicka på den och så får du upp en alternativruta. I den rutan kryssar du i "Case sensitive" under Sort order och sedan är det bara att klicka OK så är det färdigt..

 

[inlägget ändrat 2003-07-14 12:31:34 av Per Björklund]

Länk till kommentar
Dela på andra webbplatser

Jamen ja! :)

 

Vilken tur att jag åtminstone kan skylla på att det inte är jag som är databasadministratör, men nu kan jag ju tipsa vederbörande :)

 

Poäng!

 

/J

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...