Volledige versie bekijken : [Java/SQL] Dubbels wegwerken uit data van database, en inladen in ComboBox



Subhero
12 May 2010, 20:59
Het doel is dus dat ik van elke gemeente die ik uit de database haal de dubbels wegwerk zodat elke gemeente maar 1 maal toont in de combobox. Het inladen werkt prima maar de dubbels blijven zich voordoen.

Ik gebruik de DISTINCT methode maar deze wil gewoon niet lukken. DISTINCT * werkt ook niet dat heb ik geprobeerd. Iemand had me dan aangeraden om gewoon alle kolommen op te sommen en daarop de DISTINCT methode toe te passen, maar ook dan toont de combobox de dubbels.


public Vector<jstageGemeente> getjStageGemeente() {

Statement stmt = null;
ResultSet rs = null;
jstageGemeente gemeente = null;
Vector <jstageGemeente> resultaat = new Vector<jstageGemeente>();

try {
stmt = connection.createStatement();
rs = stmt.executeQuery("SELECT DISTINCT id, postcode, gemeente FROM jstageGemeente");

while (rs.next()) {
gemeente = new jstageGemeente();
gemeente.setId(rs.getInt(1));
gemeente.setPostcode(rs.getInt(2));
gemeente.setGemeente(rs.getString(3));
resultaat.add(gemeente);
}
}
catch(Exception e) {
e.printStackTrace();
}
finally
{ try {
if(stmt!=null) stmt.close();
if(rs!=null) rs.close();
} catch(SQLException e){}
}
return resultaat;
}

carl
12 May 2010, 21:07
Je moet distinct gebruiken op hetgene wat uniek moet zijn, de postcode of gemeentenaam in dit geval.

Het getuigd van een slecht aangemaakte database dat het uberhaupt mogelijk is om dubbele records te hebben :p Dat probleem had kunnen vermeden worden door bijvoorbeeld de postcode als primary key te nemen.

Subhero
12 May 2010, 21:25
Ja het is toch deze database die we moeten gebruiken, het kan goed zijn dat dit expres gedaan is om ons voor dit probleem te stellen. Aan de database mogen we ook niets veranderen.

Ik gebruik de distinct methode en inderdaad wanneer je de query invoert op zichzelf krijg je geen dubbels terug.
SELECT DISTINCT gemeente FROM jstageGemeente

Maar met deze query krijg ik niets in mijn combobox geladen.

carl
12 May 2010, 22:24
rs = stmt.executeQuery("SELECT DISTINCT id, postcode, gemeente FROM jstageGemeente");
naar
rs = stmt.executeQuery("SELECT id, postcode, DISTINCT gemeente FROM jstageGemeente");

Aangezien je voor volgende code:

while (rs.next()) {
gemeente = new jstageGemeente();
gemeente.setId(rs.getInt(1));
gemeente.setPostcode(rs.getInt(2));
gemeente.setGemeente(rs.getString(3));
resultaat.add(gemeente);
}

Die gegevens nodig hebt.

Je zal ook sowieso een error gekregen hebben. Ik zie trouwens het nut niet in van in je finally block nogmaals te gaan testen op een SQLException ? Stop die gewoon in het try blok.

Subhero
12 May 2010, 22:29
Heb ik ook al geprobeerd. Dit geeft een error in mijn SQL en de ComboBox blijft leeg.

Toch bedankt.

carl
12 May 2010, 22:30
'een' error zijn we niet veel mee :p

De foutboodschap zou al een eindje helpen ;)

Subhero
12 May 2010, 22:33
Error code 1064, SQL state 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT gemeente FROM jstageGemeente LIMIT 20 OFFSET 0' at line 1

Het blijkt een gewone syntax error te zijn. Maar ik ben er niet zo goed mee dus wss zal het nog iets anders zijn. :-)

Subhero
12 May 2010, 22:36
Ik zie trouwens het nut niet in van in je finally block nogmaals te gaan testen op een SQLException ? Stop die gewoon in het try blok.

Dit heb ik uit een voorbeeld van mijn docente.

carl
12 May 2010, 23:52
Ik zou het vrij vreemd vinden, maar wat zegt "SELECT DISTINCT gemeente, id, postcode FROM jstageGemeente" ?

Moet je wel je resultset resultaten aanpassen ;)

Subhero
13 May 2010, 00:28
Ik ben niet zeker met wat je bedoelt? Wat moet ik aan de resultset aanpassen?

Met SELECT DISTINCT gemeente, id, postcode FROM jstageGemeente heb ik geen probleem, behalve de dubbels dan. Alles laad in de combobox.

ultddave
13 May 2010, 00:43
SELECT id, postcode, DISTINCT gemeente FROM jstageGemeente
@Carl; Ik denk niet dat die query bestaat. Tussen SELECT en DISTINCT hebk alleszins toch nooit iets gezien. ;)


Probeer deze eens;


SELECT DISTINCT (gemeente), id, postcode FROM jstageGemeente GROUP BY gemeente

Als je meerdere kolommen wilt opvragen, maar enkel 1 kolom wilt checken op uniqueness moet je die specifieke kolomnaam tussen haakjes plaatsen. En je moet een GROUP BY voorzien op die kolom.

Je moet dan wel oppassen aangezien de eerste kolom in de resulset "gemeente" zal zijn. De tweedde "id" en de derde "postcode". Dus de code in de while lus, moet je wat aanpassen. ;)

gemeente.setId(rs.getInt(2));
gemeente.setPostcode(rs.getInt(3));
gemeente.setGemeente(rs.getString(1));


Mvg,
Dave

Subhero
13 May 2010, 13:19
Het werkt. Erg bedankt!