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

SQL


hjälp

Rekommendera Poster

Hej! Jag har följande SQL-fråga:

 

String query = "select Sid from Student, Kurs, Godkaend where Kurs.Kid = Godkaend.Kid " + "AND Student.Sid = Godkaend.Sid AND Student.Sid =" + tal;

 

I början står det "select Sid from Student, Kurs...

 

Problemet här är, att Kolumnen Sid finns i olika tabeller. För att urskilja vilket Sid jag menar försökte jag med Student.Sid som jag gör senare. Detta fungerar i Where-biten, men inte i början. Vad kan vara fel?

 

Länk till kommentar
Dela på andra webbplatser

Det känns kanske mer som en SQL-fråga än en java-fråga men ungefär så här borde det bli:

SELECT s.sid, k.sid, g.sid FROM Stundent AS s, Kurs AS k, Godkaend AS g WHERE k.kid = g.kid AND s.sid = g.sid AND s.sid = <tal>

 

http://dev.mysql.com/doc/mysql/en/SELECT.html beskriver de vanligaste användningarna av SELECT, även om några av dem kan behöva modifieras om man kör andra databaser.

 

 

Länk till kommentar
Dela på andra webbplatser

Hej! Tack för hjälpen, dock fungerar det inte riktigt. Anledningen till att jag postade det här och inte i SQL var att jag trodde att det var en javaspecifik fråga. Använder Access och det är kanske det som är problemet.

 

SELECT s.sid, k.sid, g.sid FROM Stundent AS s, Kurs AS k, Godkaend AS g WHERE k.kid = g.kid AND s.sid = g.sid AND s.sid = <tal>

 

Ovanstående fungerade inte men:

 

SELECT K.* FROM Stundent AS s, Kurs AS k, Godkaend AS g WHERE k.kid = g.kid AND s.sid = g.sid AND s.sid = <tal>

 

fungerar bra. Problemet är att jag vill inte ha alla kolumner i Kurs, utan bara vissa. Försökte då med K.Kid och K.Namn. men då hittas inte kolumnerna.

 

Länk till kommentar
Dela på andra webbplatser

Ovanstående fungerade inte

Det är inte speciellt lätt att hjälpa dig om du inte berättar vad som inte fungerar, vad händer? får du något fel och isf vilket?

 

Jag har inte Access installerat men senast jag körde det gick det har jag för mig att det gick bra att göra frågor med det grafisk gränssnittet och se vilken SQL som behövs för att köra frågan utanför det grafiska gränssnittet. Det kanske kan vara värt att testa?

 

Problemet är att jag vill inte ha alla kolumner i Kurs, utan bara vissa. Försökte då med K.Kid och K.Namn. men då hittas inte kolumnerna.

Om du klistrar in hur de berörda tabellerna ser ut och vad du får för fel så kan du nog få rätt bra hjälp (och kanske kan moderatorn flytta tråden?).

 

 

Länk till kommentar
Dela på andra webbplatser

Mina tabeller är Student som har Kolumnerna Sid (Primärnyckel) och Namn.

 

Kopplingstabellen Godkaend som har Kolumnerna Sid (sekundärnyckel), Kid(sekundärnyckel) Moment, datum och resultat.

 

Kurs har Kolumnerna Kid (Primärnyckel) och Namn.

 

String query = "select K.* "+

"from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid " +

"AND S.Sid = G.Sid AND S.Sid =" + tal;

 

String query2 = "select S.* "+

"from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid " +

"AND S.Sid = G.Sid AND K.Kid =" + tal;

 

 

Så här ser min frågor ut då de fungerar. Om jag byter ut Select K.* t.ex. till Select K.Kid, K.Namn fungerar det inte. Jag får felmeddelandet att kolumnen inte finns.

 

Anledningen till att jag inte postade det i SQL är att detta borde fungera, åtminstone fungerade det med SQL server. Och eftersom tabellerna känns igen senare t.ex. S.Sid = G.Sid, förstår jag inte varför det första inte fungerar.

 

Hoppas det hjälper.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Om access säger att kolumnen inte finns så finns den nog inte, det låter som om du har stavat fel alternativt använt ett fältnamn som är ett reserverat ord.

 

Om nu inte Access har någon variant på kommandot describe som du kan använda för att ge oss en komplett tabellbeskrivning och du inte kan klistra in ett exakt felmeddelandet så blir det rätt omöjligt att ge dig förslag utan att vara just access-guru, det är jag inte.

 

Om frågorna fungerar när du skriver k.* men inte då du skriver k.namn så tycker jag du kan fortsätta med det, använder du access antar jag att applikationen är så liten att det lilla extra datat inte spelar någon roll.

 

Anledningen till att jag inte postade det i SQL

Jo, du skrev det ovan. Det var därför jag föreslog att mdoeratorn skulle flytta inlägget i fråga (det var alltså inte en uppmaning till dig).

 

 

Länk till kommentar
Dela på andra webbplatser

Tråden flyttas till Databaser & SQL

 

/OZn - Moderator för Java

_______________________________________________________

Microchips - De små potatisflingorna du äter allra sist i chipspåsen

 

Länk till kommentar
Dela på andra webbplatser

Jo, det är bara en skoluppgift på Högskolan. Får väl acceptera det och klura vidare.

 

Tack för all hjälp.

 

P.S. Här är felmeddelandet.

java.sql.SQLException: [Microsoft][Drivrutin för ODBC Microsoft Access] För få parametrar angavs. 1 förväntades.

at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)

at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)

at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)

at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)

at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253)

at Databashanterare.selectSomeFromExempel(Databashanterare.java:156)

at HuvudFrame.actionPerformed(HuvudFrame.java:372)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)

at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)

at java.awt.Component.processMouseEvent(Component.java:5100)

at java.awt.Component.processEvent(Component.java:4897)

at java.awt.Container.processEvent(Container.java:1569)

at java.awt.Component.dispatchEventImpl(Component.java:3615)

at java.awt.Container.dispatchEventImpl(Container.java:1627)

at java.awt.Component.dispatchEvent(Component.java:3477)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)

at java.awt.Container.dispatchEventImpl(Container.java:1613)

at java.awt.Window.dispatchEventImpl(Window.java:1606)

at java.awt.Component.dispatchEvent(Component.java:3477)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100

 

Länk till kommentar
Dela på andra webbplatser

och din SQL-sats ser ut hur då när du skickar in den i executeQuery()?

(alltså, skriv ut den, när den är färdigihopsatt, precis som den ser ut när du skickar in den, förslagsvis med en System.out.println(query) eller motsvarande).

 

Om jag skickar in exakt nedanstående i en databas som ser ut precis som din så får jag ut ett resultat med tre kolumner (sid, kid, och sid):

[color="#0000ff"]SELECT[/color] s.sid, k.kid, g.sid [color="#0000ff"]FROM[/color] Student AS s, Kurs AS k, Godkaend AS g [color="#0000ff"]WHERE[/color] k.kid = g.kid [color="#0000ff"]AND[/color] s.sid = g.sid [color="#0000ff"]AND[/color] s.sid =1

 

Min gissning är att du inte har fått med siffran på slutet av någon anledning, men som sagt. Det går ju inte att sia om utan att få se din SQL-sats i sin helhet.

 

 

Länk till kommentar
Dela på andra webbplatser

Hej fhe. Nej det var inte min SQl-sats.

 

Min var bl.a.:

 

 

String query = "select K.sid, K.Namn"+

"from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid " +

"AND S.Sid = G.Sid AND G.Moment = 'Tentamen' AND S.Sid ="+tal;

 

Och då borde jag fått ut två kolumner, men jag får bara felmeddelande.

 

Länk till kommentar
Dela på andra webbplatser

Om du får samma felmeddelande som du nyss postade så har det med SQL-satsen att göra och ett fel som jag ser (om den ser ut exakt som du postat den) är att du glömt ett mellanslag mellan K.Namn och "

 

String query = "select K.sid, K.Namn "+

"from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid " +

"AND S.Sid = G.Sid AND G.Moment = 'Tentamen' AND S.Sid ="+tal;

 

Den du postade kommer bli K.Namnfrom stället för K.Namn from

 

/OZn

_______________________________________________________

Microchips - De små potatisflingorna du äter allra sist i chipspåsen

 

Länk till kommentar
Dela på andra webbplatser

Min var bl.a.:

String query = "select K.sid, K.Namn"+

"from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid "

Det där är ingen SQL-sats, det är javakod. Det jag bad dig posta var SQL-satsen som den ser ut när du skickar in den till executeQuery, det blir lättare att se sådana fel som OZn påpekar nedan då.

 

Länk till kommentar
Dela på andra webbplatser

 

Ändrade det och då får jag:

 

java.sql.SQLException: Column not found

at sun.jdbc.odbc.JdbcOdbcResultSet.findColumn(JdbcOdbcResultSet.java:1852)

at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:413)

at Databashanterare.selectSomeFromExempel(Databashanterare.java:180)

at HuvudFrame.actionPerformed(HuvudFrame.java:385)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)

at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)

at java.awt.Component.processMouseEvent(Component.java:5100)

at java.awt.Component.processEvent(Component.java:4897)

at java.awt.Container.processEvent(Container.java:1569)

at java.awt.Component.dispatchEventImpl(Component.java:3615)

at java.awt.Container.dispatchEventImpl(Container.java:1627)

at java.awt.Component.dispatchEvent(Component.java:3477)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)

at java.awt.Container.dispatchEventImpl(Container.java:1613)

at java.awt.Window.dispatchEventImpl(Window.java:1606)

at java.awt.Component.dispatchEvent(Component.java:3477)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Kan Access SQL vara Case-sensitive möjligen? Tror inte det...men testa att kolla det.

 

Länk till kommentar
Dela på andra webbplatser

Select K.Kid, K.Namn

from Student AS S, Kurs AS K, Godkaend AS G

Where K.Kid = G.Kid AND S.SID = G.Sid AND K.Kid = 5 (t.ex.)

 

Är det så här du menar, annars förstår jag inte hur jag ska göra.

 

Så här blir det om man kör println:

 

select K.Kid from Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid AND S.Sid = G.Sid AND S.Sid =1

 

[inlägget ändrat 2004-07-27 22:11:55 av Net]

Länk till kommentar
Dela på andra webbplatser

Select K.Kid, K.Namn

from Student AS S, Kurs AS K, Godkaend AS G

Where K.Kid = G.Kid AND S.SID = G.Sid AND K.Kid = 5

Om det där inte fungerar och tabellerna ser ut som du säger så kan det bara bero på att databasen i fråga (i det här fallet MySQL) är case-känslig på tabellnamn (eller fältnamn) för det där är rätt.

 

Ingen här kan gissa hur dina tabeller ser ut (med stora och små bokstäver) så det är svårt att säga. Mitt förslag är fortfarande att du använder access för att se vad den genererar för SQL för motsvarande operation, det borde kunna ge dig en ledtråd.

 

 

Länk till kommentar
Dela på andra webbplatser

Jag har kollat med stora och små bokstäver, då jag också trodde detta, men det fungerar inte ändå. Det är förövrigt just Access som jag arbetar mot.

 

Mina tabeller innhåller de kolumner jag skrev med stor begynnelsebokstav och små för övrigt.

 

D.v.s.

 

Kurs:

 

Kid (primärnyckel)

Namn(namn på kurs)

Litteratur

 

Student:

 

Sid(primärnyckel)

Namn

 

Godkaend: (kopplingstabell)

 

Sid

Kid

Moment (t.ex. tentamen)

Datum

Resultat

 

Ska kanske testa att köra SQL direkt i Access. Men skumt är det...

 

[inlägget ändrat 2004-07-27 22:44:59 av Net]

Länk till kommentar
Dela på andra webbplatser

Det är förövrigt just Access som jag arbetar mot.

...

Ska kanske testa att köra SQL direkt i Access.

Jo, det var det jag menade... Att du jobbar mot Access-databaser har ju varit ett faktum hela tiden. Att testa innefrån Access borde vara det första man testar.

 

Länk till kommentar
Dela på andra webbplatser

Tror mig se vad felet är i frågan

 

SELECT s.sid, k.kid, g.sid

FROM Student AS s, Kurs AS k, Godkaend AS g

WHERE k.kid = g.kid AND s.sid = g.sid AND s.sid =1

 

Frågan i sig är helt korrekt, men det du får tillbaka i ditt recordset är två stycken kolumner som heter "sid" (s.sid och g.sid).

 

Prova med att ändar till följande:

 

SELECT s.sid as ssid, k.kid , g.sid as gsid

FROM Student AS s, Kurs AS k, Godkaend AS g

WHERE k.kid = g.kid AND s.sid = g.sid AND s.sid =1

 

 

Lycka till,

____Robbac_____________________________________

The Truth Is Out there

 

Länk till kommentar
Dela på andra webbplatser

men det du får tillbaka i ditt recordset är två stycken kolumner som heter "sid"

Klarar inte access att hantera det?

 

Länk till kommentar
Dela på andra webbplatser

Jo Access borde klara det utan problem. Problemet är hos den som hanterar recordsetet, översätter frågan till den databashanterare som skall ha frågan.

 

Om frågan går igenom utan problem, kan det i sin tur vara mottagande språk som inte klarar av att hantera det. Om du tex får två kolumner med samma namn i ett recordset i ASP får du ett felmeddelande först när du försöker accessa någon av kolumnerna med samma namn.

 

Jag säger inte att det här som är problemet, eftersom jag inte har någon möjlighet att testa det. Men jag känner igen problematiken, och vad jag har gjort för att komma runt det.

____Robbac_____________________________________

The Truth Is Out there

 

Länk till kommentar
Dela på andra webbplatser

Oavsett vilket är det ett gott råd, det blir lätt förvirrande att jobba med resultat där man har flera fält som heter samma sak om det går.

 

 

Länk till kommentar
Dela på andra webbplatser

Nej, tyvärr verkade det inte funka med att döpa om kolumnerna.

 

Jag förstår att det är svårt utan alla fakta, men jag postar gärna javafiler och databas om någon vill försöka lösa det.

 

Länk till kommentar
Dela på andra webbplatser

Hej! Jag har efter mycket mailande till Suns jdbc forum löst det.

 

http://forum.java.sun.com/thread.jsp?forum=48&thread=542263&start=30&range=15&hilite=false&q=

 

Min SQL-fråga såg ut så här ungefär:

 

 

String query = "SELECT K.Kid, K.Namn "+

"FROM Student AS S, Kurs AS K, Godkaend AS G where K.Kid = G.Kid " +

"AND S.Sid = G.Sid AND G.Moment = 'Tentamen' AND S.Sid ="+tal;

 

Sedan försökte jag spara värdet för "Litteratur" i en vektor, fast jag hämtar ju aldrig det värdet.

 

Löste det genom att kommatera bort "Litteratur";

 

(tabell.equals("Kurs"))

{

Vector rowVector = new Vector();

rowVector.add(new Integer(rs.getInt("Kid")));

rowVector.add(rs.getString("Namn"));

//rowVector.add(rs.getString("Litteratur"));

dataVector.add(rowVector);

}

 

 

Länk till kommentar
Dela på andra webbplatser

Intressant att du så sent som igår skrev:

The same with:

 

String query = "SELECT Kurs.Kid , Kurs.Namn"+

"FROM (Kurs INNER JOIN Godkaend ON Kurs.Kid = Godkaend.Kid) "+

"INNER JOIN Student ON Student.Sid = Godkaend.Sid "+

"WHERE Godkaend.Moment = 'Tentamen' AND Student.Sid =" + tal;

 

Doesn't work, but but if I choose all (K.*) it does.

på Suns forum, trots att det långt tidigare i den här tråden fanns en förklaring på varför det inte skulle fungera (eftrersom du saknar mellanslag mellan "Kurs.Namn" och "FROM".

 

Sedan försökte jag spara värdet för "Litteratur" i en vektor, fast jag hämtar ju aldrig det värdet.

 

Löste det genom att kommatera bort "Litteratur";

Det har du ju aldrig nämnt här så det var ju inte så konstigt att ingen hjälpte dig med.

 

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...