| Autor |
Beitrag |
Nightfly
      
Beiträge: 163
|
Verfasst: Mo 14.07.03 12:43
es geht um Folgende Abfrage:
Quelltext 1:
| SELECT OHR,DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" ORDER BY OHR |
Nun soll aber OHR in der Ergebnissmenge eindeutig sein, also das mehrmalige Vorkommen gleicher Werte in OHR soll unterbunden werden.
Quelltext 1:
| SELECT DISTINCT OHR,DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" ORDER BY ohr |
unterbindet aber bloß Datensätze, die sich in allen feldern gleichen. Wie kann ich erreichen das jeder wert "Ohr" bloß einmal vorkommt? Am besten der DAtensatz mit dem jüngsten Datum.
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Mo 14.07.03 13:34
Also je nach Datenbank entweder so:
Quelltext 1:
| SELECT DISTINCT(OHR),DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" ORDER BY ohr |
oder so:
Quelltext 1:
| SELECT DISTINCT(OHR),DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" GROUP BY ohr ORDER BY ohr |
Viele Grüße,
Matthias
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
Nightfly 
      
Beiträge: 163
|
Verfasst: Mo 14.07.03 13:38
leider nich, es tauchen immer noch Identische werte in der Spalte OHR auf.
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Mo 14.07.03 14:19
Was für ne Datenbank benutzt Du? In einigen geht es mit DISTINCT(OHR, MUND, NASE), NOCHEINFELD FROM ....
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
Nightfly 
      
Beiträge: 163
|
Verfasst: Mo 14.07.03 14:27
da sis ne dBase Datenbank..daran kann ich auch nix ändern.
Wie's ohne SQL geht weißt du nich zufällig? *hoff*
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Mo 14.07.03 14:41
*kotz* Vielleicht sprichst mal mit Killi, der hatte dieser Tage was ähnliches bei ner Paradox. Bei so bateibasierten RDBMS kenn ich mich leider net aus. Da gibts so viele Abweichungen zum Standard  Sorry!
Ohne gehts nur, wenn Du es von Hand machst. Alle Datensätze durchrattern, in eine StringList schreiben und dann die Dubletten entfernen. Oder bereits beim reinschreiben in die Stringlist schauen ob das schon vorhanden ist. Ist aber beides nicht wirklich komfortabel.
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Di 15.07.03 09:24
| Nightfly hat folgendes geschrieben: |
Quelltext 1:
| SELECT DISTINCT OHR,DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" ORDER BY ohr |
unterbindet aber bloß Datensätze, die sich in allen feldern gleichen... |
Hallo,
das ist ja eigentlich auch richtig so. Welchen Datensatz soll denn z.B. angezeigt werden, für gleiche Ohre aber verschiedenem Datum. Diese Entscheidung kann dir der SQL nicht abnehmen. Deshalb ist mir auch keine direkte Syntax bekannt, die dir dein Ergebnis liefert.
Gruss,
Tom
|
|
Nightfly 
      
Beiträge: 163
|
Verfasst: Di 15.07.03 09:59
zum Beispiel den Datensatz mit dem neuesten Datum. Find schon das SQL mir das abnehmen könnte. 
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Di 15.07.03 10:02
OK,
wenn du das also so präzisieren kannst, dann gibts auch wieder ne Lösung, die dann ungefähr so aussieht
Quelltext 1: 2: 3:
| select Ohr, max(Datum) as Datum from Krank group by Ohr order by Ohr |
Zur Hilfe, kuck dir mal Begriffe wie Agregatfunktionen an.
Gruss,
Tom
|
|
Neuromancer
      
Beiträge: 42
WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
|
Verfasst: Do 17.07.03 09:54
Eine andere Möglichkeit ist die folgende: Je nachdem wie leistungsfähig dein SQL-Interpreter ist (kenne mich mit DBase eigentlich kaum aus), lässt er sich eventuell für jedes Feld einzeln mitteilen, wie die Daten zurückkommen sollen. Hierbei kann dir ein JOIN helfen, der auf die selbe Tabelle zeigt. Folgender Code funktioniert zumindest auf einem M$-SQL-Server (ab 7.0)
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| SELECT DISTINCT k1.Ohr, (SELECT TOP 1 k2.Datum FROM Krank k2 WHERE k2.Ohr = k1.Ohr) AS Datum, (SELECT TOP 1 k3.Art FROM krank k3 WHERE k3.Ohr = k1.Ohr) AS Art, . . . // hier die anderen Felder eintragen, immer nach dem selben Schema . . . FROM krank k1 WHERE ART = "BW" ORDER BY ohr |
Natürlich lassen sich in den sogenannten Inline-Queries auch noch andere Spezifikationen einbauen, hier ist so gut wie alles erlaubt (z.B. ein ORDER BY) Es liegt also an dir. Gepaart mit den Aggregatsfunktionen sind die resultierenden Möglichkeiten nahezu unendlich.
Wichtig ist nur, dass du mit einem TOP 1 immer nur ein Feld zurücklieferst.
Gruß
|
|
Nightfly 
      
Beiträge: 163
|
Verfasst: Do 17.07.03 11:50
Das könnte gehen, aber jetzt hab ich eine routine geschrieben mit der ich die gewünschten Datensätze einzeln raussuch. Das tut's auch erstmal. Aber das SQL-Statement von Neuromancer sieht schonmal seeehr gut aus, evtl bau ich nochmal um.
|
|
Neuromancer
      
Beiträge: 42
WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
|
Verfasst: Do 17.07.03 12:10
Wie gesagt, ich bin mir nicht sicher, ob sich das so einfach nach dbase-SQL übersetzen lässt. Meines Wissens nach ist ein TOP nicht SQL-92-konform, sondern M$-spezifisch (Interbase z.B. beherrscht ihn - glaube ich - nicht.
Ich würde das erstmal mit einer einfachen Query probieren.
Gruß
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Do 17.07.03 13:01
| Neuromancer hat folgendes geschrieben: | | Meines Wissens nach ist ein TOP nicht SQL-92-konform, sondern M$-spezifisch (Interbase z.B. beherrscht ihn - glaube ich - nicht. |
Kann ich nur bestätigen, daß das bei DBase nicht funktionniert. Da scheiterst du sicherlich schon bei der Formulierung der Subqueries
Gruss,
Tom
|
|
Neuromancer
      
Beiträge: 42
WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
|
Verfasst: Do 17.07.03 13:32
Käme mal auf einen Versuch an...
Es gibt nochmal eine Möglichkeit, allerdings befürchte ich, dass diese noch weniger Chancen hat, auf dbase-Basis zu laufen, denn sie bedient sich eines Cursors, und Cursor beherrschen IMHO nur die wenigsten SQL-Dialekte.
Dazu kann man folgendermaßen vorgehen: - eine TempTable erstellen, die alle Felder enthält, die bei der Ausgabe erscheinen sollen
- einen Cursor erstellen für einen SELECT DISTINCT Ohr.
- den Cursor durchgehen und von allen gefundenen Datensätzen den ersten gewünschten Datensatz in einer Variablen speichern
- die Variable in die TempTable einpflegen
- die TempTable als Resultset zurückgeben lassen.
Aber wie gesagt, auch hier braucht man eine Möglichkeit, sich aus einem Recordset immer nur den ersten Datensatz zurückliefern zu lassen (TOP).
Mal ganz abgesehen von dem Hauptnachteil dieser Methode: sie ist nämlich sehr, sehr langsam.
Gruß
|
|
|