# Doppelte Daten in Spalte, nur die erste abrufen wie?



## java007 (21. Apr 2010)

Hallo Leute,

in der einen Spalte meiner Datenbank über die ich die Daten abrufen möchte existieren identische Daten.  Ich möchte sozusagen in dieser Spalte das jeweile Datum finden, ohne  dass die weiteren identischen Daten in dieser Spalte weiterhin berücksichtigt werden, sodass bei der ersten gleich stop gemacht wird und so die Daten von der Zeile abgerufen. 

Wenn keine identischen Daten in der Spalte existieren, funktioniert der von mir erstellte SQL-Code, folgendermaßen:

[JAVA=42]

ResultSet rs = stmt.executeQuery("SELECT " + Daten[t] + " FROM Daten Where Alter = '"+a+"' ");
[/code]

Ich würde mich auf eure Hilfe super freuen  

Vielen Dank


----------



## Gast2 (22. Apr 2010)

Da hilft dir das [c]DISTINCT[/c] keyword weiter.


----------



## java007 (22. Apr 2010)

Hi fassy,

danke für dein tip, allerdings funzt es nicht so wie ich es mir wünsche. 
Ich möchte einfach nur, dass nur die erste Zeile, bei dem es zutrift, angezeigt wird. Die restlichen Zeilen wo es auch zutreffen kann sollen vernachlässigt werden.

Mir macht das Array noch kopfschmerzen wie ich das einbaun könnte

[JAVA=42]
for (int t =0 ; t <= daten.length - 1; t++)  {

ResultSet rs = stmt.executeQuery("SELECT " + Daten[t] + " FROM Daten Where Alter = '"+a+"' ");
ResultSetMetaData rsmd = rs.getMetaData(); ................

[/code]

also da wo alter zutrifft, stopp machen und diese zeiel abrufen, sodass das array nur für diese zeiel vorgesehen wird und die restliche zeilen die auch plausibel wären auslasen


gruß


----------



## Gast2 (22. Apr 2010)

also du möchtest nur eine Zeile als resultset bekommen?

Welche Datenbank nutzt du?

Bei Oracle hängst du einfach ein [c]AND ROWNUM = 1[/c], bei MySQL ein [c]LIMIT 0,1[/c], evtl macht es noch Sinn dann ein [c]order by[/c] dazu zupacken damit du mehr Kontrolle drüber hast welches die erste Zeile ist.

Was macht dir den bei dem Array Kopfschmerzen? Ich verstehe nicht so ganz was du machen willst. Momentan rufst du z.B: 5 mal ein Select auf um 5 spalten mit den gleichen Bedingungen zu selektieren.

Warum nicht die Schleife weglassen und [c]Select * FROM[/c] und dann beim Fetchen der resulst die Spalten entsprechend auslesen? Wäre deutlich performater.

Du solltest übrigens ganz dringen ein PreparedStatement verweden... Dann kannst du dir das Quoting um [c]'"+a+"'[/c] auch sparen und es ist um einiges sicherer


----------



## java007 (22. Apr 2010)

Hi fassy,

danke für die Tipps ich teste sie gleich mal aus,
was mir kopfschmerzen macht ist eigentlich dass

[JAVA=42]

...Where Alter = '"+a+"' ");  
[/code]

das prog geht in der spalte Alter alle identischen alter durch, soll aber bei dem ersten stehen bleiben


----------



## Michael... (22. Apr 2010)

Wie soll den das Statement ohne Java Variablen aussehen? Wenn Du die Werte einer Spalte abfragst, reicht ja - wie bereits erwähnt - ein simples distinct. Oder willst Du doch mehrere Werte aus unterschiedlichen Spalten abfragen bzw. was genau willst Du eigentlich von der DB wissen?


----------



## java007 (22. Apr 2010)

das prog geht in der spalte "Alter" alle identischen alter durch, soll aber bei dem ersten stehen bleiben  und dann diese zeile auslesen 

das möchte   aber klappt nicht irgendwie

gruß


----------



## Gast2 (22. Apr 2010)

Du drückst dich etwas unverständlich aus.

Gib doch mal ein bisschen mehr Quellcode dann können wir da mehr zu sagen. Mir sieht deine Schleife da mächtig unlogisch aus.


----------



## java007 (22. Apr 2010)

sorry, dass ich  alles es ein wenig unverständlich formuliert habe, also
ich habe in der Datenbank die spalten

Name | Vorname| Alter| Ort |Plz|

nun möchte ich mit einem vorgegebenem Alter in die Datenbank gehen und die erste zeile  die diesen Alter-Wert beinhaltet finden (es gibt auch weitere zeilen mit dem selben Alter diese vernachlässigen, nur die erst gefundene in der tabele betrachten, also die zuerst gefunden wird). Sobald diese zeile mit dem jeweiligen Alter gefunden ist, dann aus dieser zeile Name, Vorname, Alter, Ort, Plz auslesen und am ende
diese Daten in einen String Array einlesen
sodass ich am ende zB einen String Array wie das hier habe, mit folgendem Inhalt:

String Array {Name, Vorname, Alter, Ort, PLZ}

[JAVA=42]
for (int t =0 ; t <= daten.length - 1; t++)  {

ResultSet rs = stmt.executeQuery("SELECT " + Daten[t] + " FROM Daten Where Alter = '"+a+"' ");
ResultSetMetaData rsmd = rs.getMetaData(); ................[/code]

in dem array Daten[t] sind die Spaltennamen Name, Vorname, Alter, Ort, PLZ und so dachte ich mir dass ich diese daten mit dem obigen code abrufen kann. Allerdings wenn ich das mit dem obigen code so mache dann werden alle identischen Alter in der Spalte Alter berücksichtigt was ich ja nun nicht will.  Ich kriege dann hintereinander  alle Vornamen von den Personen die den jeweiligen Alter haben 
das ist mein problem, ich hoffe dass es nun verständlich ist.
Vielen Dank nochmals für eure Geduld,
gruß


----------



## Gast2 (22. Apr 2010)

Nein, so ganz klar ist mir das nicht.

du hast also ein Tabelle mit (nurmal vorname und alter angesehn):

Klaus, 14
Petra, 31
Kurt, 21
Klara, 14

Wenn du jetzt noch Alter 14 suchst soll NUR Klaus zurückkommen?

Ich verstehe einfach nicht wozu das gut ist und was du eigentlich machen möchtest.


Wie ich schon mal weiter oben meinte: Warum fragst du nicht Name,Vorname,Alter,Ort und PLZ in einem SELECT ab. 

Probier mal:


```
PreparedStatement stmt = connection.prepareStatement("SELECT Name,Vorname,Alter,Ort,PLZ FROM Daten WHERE Alter = ?");
stmt.setString(1, "14"); // oder halt in deiner Schleife stmt.setString(1, a); 
ResultSet rs = stmt.executeQuery();

while(rs.next()){
	String[] row = new String[]{
			rs.getString("Name"),
			rs.getString("Vorname"),
			rs.getString("Alter"),
			rs.getString("Ort"),
			rs.getString("PLZ"),
			};
      System.out.println(Arrays.toString(row));
}
```

Das würde dir jetzt z.B. die rows für Klaus und Klara ausgeben. Wenn du jetzt nur Klaus haben willst - mit LIMIT begrenzen.

Also 

```
PreparedStatement stmt = connection.prepareStatement("SELECT Name,Vorname,Alter,Ort,PLZ FROM Daten WHERE Alter = ? LIMIT 0,1");
```

aber wie gesagt schau dir erstmal das an und sag dann was dir daran nicht passt


----------



## Michael... (22. Apr 2010)

java007 hat gesagt.:


> nun möchte ich mit einem vorgegebenem Alter in die Datenbank gehen und die erste zeile  die diesen Alter-Wert beinhaltet finden


Willst Du selbst festlegen was die erste Zeile ist oder bleibt das der Datenbank überlassen?
Wie bereits erwähnt könntest Du - abhängig von der Datenbank - mit Rownum oder Limit nur einen Datensatz zurückliefern lassen.
Alterativ könntest Du Dir nur den ersten Satz des ResultSets weiterverarbeiten.


java007 hat gesagt.:


> [JAVA=42]
> stmt.executeQuery("SELECT " + Daten[t] + " FROM Daten Where Alter = '"+a+"' ");[/code]
> 
> in dem array Daten[t] sind die Spaltennamen Name, Vorname, Alter, Ort, PLZ und so dachte ich mir dass ich diese daten mit dem obigen code abrufen kann.


Das wird so nicht funktionieren. Da Du eher alle Werte abfragst, könntest Du gleich 
	
	
	
	





```
Select *
```
 verwenden bzw. die Felder direkt ins Statement schreiben. Mit dem Array müsstest Du Dir das Statement über eine Schleife zusammenbasteln.


----------



## java007 (22. Apr 2010)

Hallo fassy, michael,

erstmal möchte ich mich sehr für eure Hilfe mich bedanken 

@fassy

ohne limi 0hne LIMIT 0,1 funktioniert es einwandfrei, es werden alle zeilen ausgegeben allerdings sobal ich LIMIT 0,1 einfüge
folgendermaßen:
[JAVA=42]

PreparedStatement stmt = con.prepareStatement("SELECT Name, Vorname, Alter, Ort, PLZ FROM Daten WHERE Alter = ? LIMIT 0,1");
		stmt.setString(1, "14"); // oder halt in deiner Schleife stmt.setString(1, a); 
ResultSet rs = stmt.executeQuery();

while(rs.next()){
    String[] row = new String[]{
            rs.getString("Name"),
            rs.getString("Vorname"),
            rs.getString("Alter"),
            rs.getString("Ort"),
            rs.getString("PLZ"),
            };
      System.out.println(Arrays.toString(row));
		}


		stmt.close();
		con.close();
		return row;
	}
[/code]

bei :

ResultSet rs = stmt.executeQuery();

macht er stopp und gibt folgende fehlermeldung

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Alter = Pa_RaM000 LIMIT 0,1'.
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)....

achja ich möchte nich mitteilen, dass ich als Datenbank  "MS-Access" benutze


Vielen Dank nochmals für alles und Gute Nacht erstmal


----------



## Gast2 (22. Apr 2010)

Deswegen die Frage nach der benutzen Datenbank, probier mal:

```
SELECT Name, Vorname, Alter, Ort, PLZ FROM Daten WHERE Alter = ? TOP 1
```


----------



## java007 (23. Apr 2010)

Guten Morgen fassy 

Ich habe nun "TOP 1" folgendermaßen eingegeben:

[JAVA=42]
....eStatememt("SELECT Name, Vorname, ALTER, Ort, PLZ FROM Daten WHERE 'ALTER = ? TOP 1' ");[/code]

ohne ' ' gab es eine Fehlermeldung, sodass ich diese einfügen musste.

Nun sobald ich es ausführe, bleibt er bei :

[JAVA=42]
stmt.setString(1, "14");
[/code]

stehen und gibt mir folgende Meldung:

[JAVA=42]
java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(Unknown Source)....
[/code]


wie gesgt ohne TOP 1 funzt es wunderbar allerdings bekomme ich dann alle Zeilen  

Gruß


----------



## Michael... (23. Apr 2010)

java007 hat gesagt.:


> Ich habe nun "TOP 1" folgendermaßen eingegeben:
> [JAVA=42]
> ....eStatememt("SELECT Name, Vorname, ALTER, Ort, PLZ FROM Daten WHERE 'ALTER = ? TOP 1' ");[/code]


Das ist ja keine gültige Syntax.
Wieso quälst Du Dich denn, mit der Begrenzung auf einen Datensatz? Nimm halt einfach das entgegen was die Datenbank zurückgibt und verwende nur den ersten Datensatz, oder ist die Datenmenge so umfangreich?

Ich würde übrigens das Alter als Ganzzahl und nicht als String in der Datenbank speichern, dann könnte man Durchschnittswerte ermitteln auf > oder < vergleichen...


----------



## java007 (23. Apr 2010)

Das Probelm ist endlich gelöst und zwar folgendermaßen 

[JAVA=42]
PreparedStatement stmt = con.prepareStatement("SELECT TOP 1 Bezeichnung, PLZ, Ort, PAN, BIC, PZBM FROM Daten WHERE BLZ = ?");


[/code]

TOP 1 muss direkt hinter Select kommen 

Vielen Dank an alle 

endlich hurraaa 

Gruß


----------

