# SQL-Exception trotz funktionierendem SELECT



## MarDaiBre (20. Okt 2014)

Hallo,

mein Java-Programm soll mir die Ergebnisse einer SELECT-Abfrage visualisieren. Die Visualisierung funktioniert. Nun möchte ich zusätzlich verschiedene Werte gezählt bekommen (Anzahl der verschiedenen Fehlerarten, Fehlerorte, Mitarbeiter etc.). Die Datenbank ist eine MS Access DB. Das entsprechende Coding zur Abfrage sieht wiefolgt aus:


```
// BLOCK 1 zur Anzeige der Ergebnisse
query = "SELECT Fehler.F_ID AS Fehlernummer, Fehler.O_ID AS Fehlerortnummer, Fehlerort.O_Bezeichnung AS Fehlerortbezeichnung, Fehlerort.O_Lage_X AS [Fehlerort Lage X], Fehlerort.O_Lage_Y AS [Fehlerort Lage Y], Quadrant.Q_ID AS Quadrant, Fehler.A_ID AS Fehlerartnummer, Fehlerart.A_Art AS Fehlerart, Fehler.F_Lage_X AS [Fehler Lage X], Fehler.F_Lage_Y AS [Fehler Lage Y], Fehler.B_ID AS Baureihe, Fehler.F_Produktionsnummer AS Produktionsnummer, Fehler.F_Erfassung AS Erfassung, Fehler.M_ID AS Primärverursacher"
	+ " FROM ((Fehlerart INNER JOIN (Fehlerort INNER JOIN Fehler ON Fehlerort.O_ID = Fehler.O_ID) ON Fehlerart.A_ID = Fehler.A_ID) INNER JOIN Risikoset ON (Fehlerort.O_ID = Risikoset.O_ID) AND (Fehlerart.A_ID = Risikoset.A_ID)) INNER JOIN (Quadrant INNER JOIN Risiko ON Quadrant.Q_ID = Risiko.Q_ID) ON Risikoset.S_ID = Risiko.S_ID"
	+ " WHERE (((Fehler.O_ID)=[Risikoset].[O_ID]) AND ((Fehler.A_ID)=[Risikoset].[A_ID]) AND ((Fehler.F_Lage_X)>=[Quadrant].[Q_Von_X] And (Fehler.F_Lage_X)<=[Quadrant].[Q_Bis_X]) AND ((Fehler.F_Lage_Y)>=[Quadrant].[Q_Von_Y] And (Fehler.F_Lage_Y)<=[Quadrant].[Q_Bis_Y]))"
	+ " AND Fehler.F_Erfassung BETWEEN #" + vonMonat + "/" + vonTag + "/" + vonJahr + "# AND #" + bisMonat + "/" + bisTag + "/" + bisJahr + "#"
	+ " GROUP BY Fehler.F_ID, Fehler.O_ID, Fehlerort.O_Bezeichnung, Fehlerort.O_Lage_X, Fehlerort.O_Lage_Y, Quadrant.Q_ID, Fehler.A_ID, Fehlerart.A_Art, Fehler.F_Lage_X, Fehler.F_Lage_Y, Fehler.B_ID, Fehler.F_Produktionsnummer, Fehler.F_Erfassung, Fehler.M_ID"
	+ " ORDER BY Fehler.F_ID;";
db = new Datenbankschnittstelle();
table = db.baueTabelle(query);
scrollPane.setViewportView(table);
ergebnisL.setText("Ergebnis: Fehlerliste im Zeitraum " + formatter.format(vonDatumD) + " - " + formatter.format(bisDatumD) + meisterL.getText());
			
// BLOCK 2 zur ersten Berechnung (Fehlerorte)	
query = "SELECT COUNT(*)"
	+ " FROM (SELECT DISTINCT Fehler.O_ID AS Fehlerort"
	+ " FROM ((Fehlerart INNER JOIN (Fehlerort INNER JOIN Fehler ON Fehlerort.O_ID = Fehler.O_ID) ON Fehlerart.A_ID = Fehler.A_ID) INNER JOIN Risikoset ON (Fehlerort.O_ID = Risikoset.O_ID) AND (Fehlerart.A_ID = Risikoset.A_ID)) INNER JOIN (Quadrant INNER JOIN Risiko ON Quadrant.Q_ID = Risiko.Q_ID) ON Risikoset.S_ID = Risiko.S_ID"
	+ " WHERE (((Fehler.O_ID)=[Risikoset].[O_ID]) AND ((Fehler.A_ID)=[Risikoset].[A_ID]) AND ((Fehler.F_Lage_X)>=[Quadrant].[Q_Von_X] And (Fehler.F_Lage_X)<=[Quadrant].[Q_Bis_X]) AND ((Fehler.F_Lage_Y)>=[Quadrant].[Q_Von_Y] And (Fehler.F_Lage_Y)<=[Quadrant].[Q_Bis_Y]))"
	+ " AND Fehler.F_Erfassung BETWEEN #" + vonMonat + "/" + vonTag + "/" + vonJahr + "# AND #" + bisMonat + "/" + bisTag + "/" + bisJahr + "#);";
db = new Datenbankschnittstelle();
sumOrtF.setText(db.getStatistik(query));
				
// BLOCK 3 zur zweiten Berechnung (Fehlerarten)
query = "SELECT COUNT(*)"
	+ " FROM (SELECT DISTINCT Fehler.A_ID AS Fehlerart"
	+ " FROM ((Fehlerart INNER JOIN (Fehlerort INNER JOIN Fehler ON Fehlerort.O_ID = Fehler.O_ID) ON Fehlerart.A_ID = Fehler.A_ID) INNER JOIN Risikoset ON (Fehlerort.O_ID = Risikoset.O_ID) AND (Fehlerart.A_ID = Risikoset.A_ID)) INNER JOIN (Quadrant INNER JOIN Risiko ON Quadrant.Q_ID = Risiko.Q_ID) ON Risikoset.S_ID = Risiko.S_ID"
	+ " WHERE (((Fehler.O_ID)=[Risikoset].[O_ID]) AND ((Fehler.A_ID)=[Risikoset].[A_ID]) AND ((Fehler.F_Lage_X)>=[Quadrant].[Q_Von_X] And (Fehler.F_Lage_X)<=[Quadrant].[Q_Bis_X]) AND ((Fehler.F_Lage_Y)>=[Quadrant].[Q_Von_Y] And (Fehler.F_Lage_Y)<=[Quadrant].[Q_Bis_Y]))"
	+ " AND Fehler.F_Erfassung BETWEEN #" + vonMonat + "/" + vonTag + "/" + vonJahr + "# AND #" + bisMonat + "/" + bisTag + "/" + bisJahr + "#);";
db = new Datenbankschnittstelle();
sumArtF.setText(db.getStatistik(query));
```

Sobald die erste Berechnung (also Block 2) ausgeführt werden soll, wird eine Fehlermeldung generiert. Die Berechnung der Anzahl (also die letzten beiden Blöcke) habe ich bereits im Einsatz an anderer Stelle und dort funktioniert das auch. Nun sagt mir mein Programm jedes Mal an dieser oben genannten Stelle, dass er O_ID und A_ID nicht finden kann. Verstehe ich nicht, denn ich sage doch jeweils als SELECT: SELECT DISTINCT Fehler.O_ID bzw. SELECT DISTINCT Fehler.A_ID.


```
net.ucanaccess.jdbc.UcanaccessSQLException: user lacks privilege or object not found: O_ID
	at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:200)
	at risikoverwaltung.control.Datenbankschnittstelle.getStatistik(Datenbankschnittstelle.java:227)
	at risikoverwaltung.view.AuswertungGUI.actionPerformed(AuswertungGUI.java:1714)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$400(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: O_ID
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
	at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:197)
	... 38 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: O_ID
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.Table.getColumnIndex(Unknown Source)
	at org.hsqldb.Table.getColumnIndexes(Unknown Source)
	at org.hsqldb.QuerySpecification.setDistinctConditions(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveTypesPartTwo(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveTypes(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableSubqueryOrNull(Unknown Source)
	at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
	at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
	at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
	at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
	at org.hsqldb.ParserCommand.compilePart(Unknown Source)
	at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 41 more
net.ucanaccess.jdbc.UcanaccessSQLException: user lacks privilege or object not found: A_ID
	at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:200)
	at risikoverwaltung.control.Datenbankschnittstelle.getStatistik(Datenbankschnittstelle.java:227)
	at risikoverwaltung.view.AuswertungGUI.actionPerformed(AuswertungGUI.java:1722)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$400(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: A_ID
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
	at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:197)
	... 38 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: A_ID
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.Table.getColumnIndex(Unknown Source)
	at org.hsqldb.Table.getColumnIndexes(Unknown Source)
	at org.hsqldb.QuerySpecification.setDistinctConditions(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveTypesPartTwo(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveTypes(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableSubqueryOrNull(Unknown Source)
	at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
	at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
	at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
	at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
	at org.hsqldb.ParserCommand.compilePart(Unknown Source)
	at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 41 more
```

Ich habe mir die query auch schon ausdrucken lassen und wenn ich die SELECT-Abfrage direkt in Access ausführe, dann erhalte ich auch das Ergebnis. Hat jmd eine Idee, wo das Problem liegen kann?

Vielen Dank im Voraus!


----------



## Thallius (20. Okt 2014)

Kannst du den Query eventuell mal ordentlich formatieren? So habe ich keinen Bock mich da durchzuquälen

Claus


----------



## MarDaiBre (20. Okt 2014)

Hi,

ich habe die SQL-Statements mit Access erstellt. Grundsätzlich habe ich den Code zur Ermittlung der Ergebnisse (erster Block mit einem:

SELECT COUNT(*) FROM (SELECT DISTINCT Fehler.O_ID FROM (...

umrahmt. Funktioniert auch bei allen anderen Stellen, wo ich ein Ergebnis ermittel und dazu eine weitere Berechnung der Anzahlen durchführen lasse.

Ich habe einfach mal probeweise die erste Berechnung (Fehlerorte) als System.out.println drucken lassen und in Access getestet:

SELECT COUNT(*)

FROM(SELECT DISTINCT Fehler.O_ID

FROM ((Fehlerart INNER JOIN (Fehlerort INNER JOIN Fehler ON Fehlerort.O_ID = Fehler.O_ID) ON Fehlerart.A_ID = Fehler.A_ID) INNER JOIN Risikoset ON (Fehlerort.O_ID = Risikoset.O_ID) AND (Fehlerart.A_ID = Risikoset.A_ID)) INNER JOIN (Quadrant INNER JOIN Risiko ON Quadrant.Q_ID = Risiko.Q_ID) ON Risikoset.S_ID = Risiko.S_ID

WHERE Fehler.O_ID=[Risikoset].[O_ID] AND Fehler.A_ID=[Risikoset].[A_ID] AND Fehler.F_Lage_X>=[Quadrant].[Q_Von_X] AND Fehler.F_Lage_X<=[Quadrant].[Q_Bis_X] AND Fehler.F_Lage_Y>=[Quadrant].[Q_Von_Y] AND Fehler.F_Lage_Y<=[Quadrant].[Q_Bis_Y] AND Fehler.F_Erfassung BETWEEN #10/02/2014# AND #10/20/2014#);

Dann erhalte ich das gewünschte Ergebnis: 9

Ich behaupte daher mal ganz dreist, dass das SQL-Statement richtig ist, nur UCanAccess damit nicht umgehen kann. Mich wundert es nur, warum er behauptet, O_ID not found obwohl doch eindeutig die Tabelle Fehler (wo O_ID enthalten ist) nach FROM angegeben ist...


----------



## MarDaiBre (20. Okt 2014)

Funktioniert nun. Habe den kompletten Inner Join aufgelöst. Weiß aber nicht, warum da kein Ergebnis übergeben wurde...


----------



## fehlerfinder (22. Okt 2014)

Mmh, hast du Interesse, das eigentliche Problem noch zu lösen? - Ich frage lieber mal, bevor ich hier tiefer einsteige ;-)


----------

