Autor Beitrag
Nightfly
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: Mo 14.07.03 12:43 
es geht um Folgende Abfrage:

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.07.03 13:34 
Also je nach Datenbank entweder so:

ausblenden Quelltext
1:
SELECT DISTINCT(OHR),DATUM,ART,DIAGNOSE,BEHANDLUNG from KRANK where ART="BW" ORDER BY ohr					


oder so:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: Mo 14.07.03 13:38 
leider nich, es tauchen immer noch Identische werte in der Spalte OHR auf.
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Di 15.07.03 09:24 
Nightfly hat folgendes geschrieben:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: Di 15.07.03 09:59 
zum Beispiel den Datensatz mit dem neuesten Datum. Find schon das SQL mir das abnehmen könnte. :roll:
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: 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)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: 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ß