SQL Oracle - Abfrage Teilstring in Namen rausfiltern

gfeschu

Ensign
Registriert
Aug. 2010
Beiträge
147
Hallo zusammen

Weiss ehrlich gesagt nicht genau wie ich diesen Thread nennen soll...

Ich habe als Beispiel folgende Einträge in der DB


Name
------------
Grp.AB
Grp.AB-CDE
Grp.AB-CDE-EFG
Grp.AB-HI
Grp.CDE
Grp.CDE-FG
Grp.CDE-FG-HIJ
Grp.X
Grp.X-YZ


Ich möchte jetzt per Abfrage nur die Gruppen anzeigen lassen, die keine noch "längere" Gruppe haben.
Also als Ergeniss folgende Anzeige:

Result
-----------
Grp.AB-CDE-EFG
Grp.AB-HI
Grp.CDE-FG-HIJ
Grp.X-YZ

Habe gerade keine wirkliche Idee, wie ich das am gescheitesten umsetze. Hat jemand eine Idee wie ich das umsetzen könnte? Also mit welchen Mitteln ich das filtern kann?

Gruss gfeschu
 
Also die wichtige Bezeichnung geht bis zum ersten "-" ?
Ohne mich jetzt speziell an die Oracle Schreibweise zu erinnern folgender ansatz:

(1)Die Eigentliche Gruppe erhältst du durch abschneiden des substrings bis "-" (eventuell split), zB 'AB'
(2)Dann könntest du per SELECT alle Einträge einer Gruppe abfragen und von denen wiederum den Eintrag abfragen, dessen String insgesamt am längsten ist. zB 'AB-CDE-EFG'

Vielleicht gibt dir das schon eine Idee, in Oracle SQL kann ich es auch nichtmehr aus dem Kopf aufschreiben :)
 
Hier stand vorher Mist :freak:

Kannst du das nicht mit Programmierung machen, d. h. einfach mit
select * from tablename
alles auslesen und dann vom Programm einschränken?
 
Zuletzt bearbeitet:
wahli schrieb:
Kannst du das nicht mit Programmierung machen, d. h. einfach mit
select * from tablename
alles auslesen und dann vom Programm einschränken?

Gute Frage. Muss es SQL sein?

Trotzdem ist plain SQL (finde ich) am besten. Die Datenbank weiß immernoch am besten wie sie soetwas ablaufen lässt.
Alternative wäre sonst eine Procedure in Oracle.
 
Ja, an eine Procudure habe ich auch schon gedacht, aber die ist vermutlich nicht sehr schnell.

Grundsätzlich ist die DB der größte Flaschenhals beim Programmieren, deshalb würde ich es auf die schnelle eher per Programmierung lösen.
Die Procedure müsste zu jedem Namen abfragen, wie oft der String vorkommt und nur bei einmaligem Vorkommen dem Result hinzufügen.

Per Programmierung kannst du die SQL-Results gleich sortiert bearbeiten und solange den letzen Eintrag überschreiben, bis ein völlig neuer Gruppenname kommt. Das müsste auch sehr schnell sein.
 
Zuletzt bearbeitet:
Dankeschön für die Antworten.

Das per Programmierung, nach dem auslesen von allen Gruppen zu machen, wäre glaub nicht all zu schwer und wüsste auch etwa wie das realisieren würde.

Aber da es über 4000 results (Tendenz steigend) gibt, hab ich gedacht ich frag mal, ob man das nicht auch mit SQL lösen kann. Aber anscheinend nicht wirklich. :)

Na dann schaue ich mal, ob ich Ding eingermassen Performance sparend erstellen kann. :)

Danke für eure Inputs!

Gruss gfeschu
 
gfeschu schrieb:
ob man das nicht auch mit SQL lösen kann. Aber anscheinend nicht wirklich. :)

Wieso nicht?
Man kann all diese String- und SetOperationen wunderbar in ORACLE SQL machen.
Dann schaue ich nochmal im Detail und schuster etwas zusammen...

Hier hättest du schonmal 2 nützliche Bausteine:
ORACLE SQL String builtin functions
Subqueries

Aber ja, es ist nichts was man in seinem ersten SQL Tutorial lernt. Rocket Science ist es aber auch nicht.

//ADD:
Hmm ich schaue mir gerade deine Beispieldate etwas genauer an. Also der "gruppierende" String geht nicht bis zum ersten "-", sondern es ist eher der String für den es keine längere Version gibt, richtig? (Was ziemlich genau der Wortlaut ist den du oben gewählt hast ^^)



// Lösungsansatz:
Guti, habe mir mal Gedanken gemacht. Hier mein Vorschlag (Da ich kein Oracle installiert habe ist das eher pseudoCode, aber hoffentlich mit wenigen fehlern)

SELECT gparent.groupname
FROM groups gparent
WHERE NOT EXISTS (
SELECT gchild.groupname
FROM groups gchild
WHERE INSTR(gchild.groupname, gparent.groupname) == 1
AND LENGTH(gchild.groupname) > LENGTH(gparent.groupname)
)

Erklärung der INSTR-Funktion


Ich hoffe du hast Interesse dich daran zu versuchen.

Grüße, Dennis
 
Zuletzt bearbeitet:
Zurück
Oben