Hallo liebe Leute,
ich brauche Eure Hilfe!
Ich habe eine Tabelle Person mit 4 Attributen: Name, Vorname, Geburtsdatum und Geburtsort.
Ich brauche eine SQL-Abfrage, die aus Tabelle Datensätze mit Namensvetter ( Name + Vorname ) löscht, aber lässt nur den jüngsten bleiben z.B.
Schmidt | Markus | 1960 | Hamburg
Mustermann | Dieter | 1970 | Berlin
Mustermann | Dieter | 1980 | München
Ergebnis
Schmidt | Markus | 1960 | Hamburg
Mustermann | Dieter | 1980 | München
Ich bedanke mich im Voraus für Eure Muhe
Gruß
Tanja
Homepage selbermachen 7.852 Themen, 35.619 Beiträge
Bei deinem Problem kommt es auf die Datenbank an. Arbeitest Du mit einer Datenbank, welche Subselects unterstützt, so ist es relativ einfach:
DELETE FROM [Tabellenname] WHERE Vorname=(SELECT Vorname FROM [Tabellenname] GROUP BY (Vorname, Nachname)) AND Nachname=(SELECT Nachname FROM [Tabellenname] GROUP BY (Vorname, Nachname)) AND Geburtsdatum!=(SELECT MIN(Geburtsdatum) AS Datum FROM [Tabellenname] GROUP BY (Vorname, Nachname))
Ich habe das Statement zwar nicht getestet, aber es könnte so gehen. Unterstützt deine Datenbank keine Subselects, so wie z.B. MySQL, so wird es komplizierter. Da müsste ich selbst etwas herumexperimentieren.
Vielen Dank, Basil!
Aber ich darf leider aus der Tabelle nichts löschen - nur abfragen mit SELECT ....
Diese Abfrage brauche ich für Oracle und Access...
Ach so, ich hatte dein Posting anders verstanden. Dadurch wird das Ganze etwas einfacher:
SELECT Name, Vorname, MAX(Geburtsdatum), Geburtsort FROM [Tabellenname] GROUP BY (CONCAT(Name, Vorname))
Hallo Basil,
für Deine Hilfe möchte ich mich herzlich bedanken.
Es sieht tatsächlich einfach aus!
Ich habe allerdings noch eine Frage an Dich :)
Ist es möglich Werte in einer Spalte nach bestimmten Bedingungen gruppieren? z.B Attribut Alter in 3 bestimmten Gruppen (0-30, 30-60, >60) gruppieren und MAX anzeigen.
Beispiel:
Alter
10
15
20
31
33
80
Ergebnis:
Max
20
33
80
Danke Voraus. Tanja.
Ja, dies ist durchaus möglich:
SELECT MAX(Alter) FROM [Tabellenname] GROUP BY Alter BETWEEN 0 AND 30,Alter BETWEEN 31 AND 60, Alter >60
Hallo Basil,
Ich habe die erste Abfrage mit CONCAT in Access geprüft - es funktioniert leider nicht :(
Ich habe die gleiche Frage im CHIP-Forum gestellt. Schau mal...
http://www.chip.de/forum/thread.html?bwthreadid=424987
Ich ging eigentlich davon aus, daß Du Access nur als Frontend für Oracle nimmst und die Oracle-Daten nur in Access zur clientseitigen Weiterverarbeitung nutzt. Access selbst unterstützt leider nur ein ziemlich verkrüppeltes Subset von ANSI-SQL. Ich habe zwar auch schon mit Access arbeiten müssen, nutzte da aber meist Workarounds über VB um das gewünschte zu erreichen. Eventuell solltest Du einmal im MSDN nachschauen, was Access genau unterstützt, oder eventuell wirklich Access nur als Präsentationsschicht für Oracle nutzen, falls das möglich ist.
Was das CHIP-Forum angeht, so erspare ich mir sämtliche Kommentare. Ich habe mir ein paar Antworten durchgelesen, davon war kein einziger auch nur annähernd richtig. SQL unterstützt äußerst komplexe Abfragen (je nach Datenbank) und es sind sogar Fourrier-Analysen rein über SQL möglich. Ebenso bezieht MAX sich immer auf die Ergebnisse, die in WHERE oder HAVING-Klauseln gewählt werden.
Leider habe ich momentan nur Zugriff auf MySQL, Postgres und SAPdb, in diesem Datenbanken funktionieren die Abfragen, Oracle könnte ich morgen testen, Access ist bei uns (zum Glück) tabu. *g*
Richtig Basil, ich nehme Access nur als Frontend für Oracle, aber ich kann auch VIEW auf ORACLE-Ebene erstellen.
Aber ich kann es nur am Montag testen.
Auf jeden Fall vielen Dank für Deine Hilfe!
Gruß
Tanja
Noch eine Anmerkung, stelle die Frage eventuell einmal im Entwicklerforum, da ist die Chance groß jemanden zu finden, der mit Access arbeitet und die meisten Poster dort sind sehr kompetent.
Entwickler-Forum
Hallo Tanja,
probiers mal mit diese Gruppierung:
GROUP BY IF(age>60, '>60', IF(age>30,'30-60', '0-30'))
Mit MySQL funktionierts auf jeden Fall...
CU Borlander
Danke Borlander,
ich prüfe es gerade mit Access