Autor |
Beitrag |
p!nhead
      
Beiträge: 35
|
Verfasst: Mo 15.05.06 16:58
Hallo zusammen!
Folgende Problemstellung:
Ich habe eine unsortierte Tabelle in der in 5 verschiedenen Feldern Nachnamen vorkommen könnnen. Nun muss ich diese Tabelle so in ein Dataset einlesen, dass sie von A bis Z sortiert ist, allerdings nicht nur in einem Feld, sondern in allen 5.
Im Anhang ein kleines Beispiel zum besseren Verständniss.
Hat jemand eine Idee dazu die nicht mit viel Arbeit verbunden ist? 
Einloggen, um Attachments anzusehen!
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mo 15.05.06 17:09
Normalerweise kann man bei der Abfrage mehere Sortierfelder angeben
SQL-Anweisung 1:
| select * from tabelle order by feld1, feld2, feld3, feld4, feld5; |
_________________ Markus Kinzler.
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 08:10
Dann sortiert er hauptrangig Feld1 von A-Z. Nur wenn ein eintrag in Feld1 mehrfach vorkommt, wird dann innerhalb dieses Blocks nochmal nach Feld2 sortiert...
Leider nicht die Lösung des Problems.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.05.06 08:19
Und wonach soll sortiert werden, wenn in mehreren Feldern eines Datensatzes Namen drin stehen?
Auf einer Oracle-DB wüsste ich, wie man da ran gehen könnte. Ob allerdings deine DB den Befehl "Decode" kennt, weiß ich nicht. Zur Vereinfachung würde ich dir auf jeden Fall ein View empfehlen, falls das mit deiner DB machbar ist.
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 10:42
MS SQL ^^
Schau dir mal das Beispiel an, dann dürfte relativ klar werden wie sortiert werden muss (hoffe ich) 
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.05.06 10:53
Da müssen dann viellicht mal die MS-SQL-Spezis was zu sagen.
Dein Beispiel habe ich mir angesehen. Ist es wirklich so, dass innerhalb eines Datensatzes immer der selbe Name eingetragen sein kann?
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 10:56
Ja, kann, muss aber nicht 
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.05.06 11:04
Dann müsstest du für jedes asugefüllte Namensfeld den Datensatz mehrfach drin haben, da sonst nicht klar ist, wonach sortiert werden soll.
Im Moment sehe ich nur eine Lösung über "Union".
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 11:30
Genau so siehts aus!
was genau ist "Union"? Kenne ich nicht.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.05.06 12:03
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| select feld1 from tabelle where feld1 <> '' union select feld2 from tabelle where feld2 <> '' union select feld3 from tabelle where feld3 <> '' union select feld4 from tabelle where feld4 <> '' union select feld5 from tabelle where feld5 <> '' order by feld1 |
ungeprüft!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 17.05.06 12:53
1. Was steht in den Feldern drin, wenn nichts drin steht? NULL oder ''?
2. Wonach soll sortiert werden, wenn in mehreren Feldern ein Name steht?
Wenn 1=NULL und 2="1.Feld", dann klappt das hier:
Delphi-Quelltext 1: 2:
| select * from tabelle order by coalesce (feld1,feld2,feld3,feld4,feld5) |
'coalesce (x,y,z)' liefert den ersten Wert (von links aus gesehen) der Liste, der nicht NULL ist.
_________________ Na denn, dann. Bis dann, denn.
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 13:23
Ja, "Null". Aber das Problem ist, das in den 5 Feldern auch 2 oder mehrere verschiedene Namen vorkommen können.
Bsp.:
Wenn mittendrin in der Tabelle ein Datensatz kommt in dem das Feld Name1 den Wert "Marius" aber das Feld Name4 den Wert "Arnold" hat, so muss der Datensatz 2 mal erscheinen... einmal ziemlich am Anfang bei A (wegen "Arnold" in Name4) und einmal bei M (wegen "Marius" in Name1).
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 13:48
jasocul hat folgendes geschrieben: | SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| select feld1 from tabelle where feld1 <> '' union select feld2 from tabelle where feld2 <> '' union select feld3 from tabelle where feld3 <> '' union select feld4 from tabelle where feld4 <> '' union select feld5 from tabelle where feld5 <> '' order by feld1 |
ungeprüft! |
Mhh.. erstmal kommt die Meldung im Enterprise-Manager "Der Designer stellt das SQL UNION Construct nicht bereit.".
Dann scheint er es aber doch zu machen...
Aber leider weiss ich nicht wie ich das auf meine Tabelle(n) anwenden soll, da die Felder 1-5 eigtl nur ID's sind die auf eine weitere Tabelle verweisen, welche dann unter den ID's die dazugehoerigen Namen stehen hat... Momentan spucke ich die Namen dann mit "Left outer Join" aus, aber wie ich das auf dein Beispiel anwenden kann, weiss ich leider nicht.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.05.06 14:18
Das join kannst du trotzdem machen. Allerdings jetzt bei jedem einzelnen Statement des Union-Konstrukts.
|
|
p!nhead 
      
Beiträge: 35
|
Verfasst: Mi 17.05.06 14:31
ich habe es mal versucht so auf meine Tabellen anzuwenden:
exklusives Beispiel:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| SELECT dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID FROM dbo.tblVertragsabschluss LEFT OUTER JOIN dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_AB = dbo.tblAdresse.int10_AdressenID WHERE (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301') UNION SELECT dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID FROM dbo.tblVertragsabschluss LEFT OUTER JOIN dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_S1 = dbo.tblAdresse.int10_AdressenID WHERE (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301') UNION SELECT dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID FROM dbo.tblVertragsabschluss LEFT OUTER JOIN dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_S2 = dbo.tblAdresse.int10_AdressenID WHERE (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301') ORDER BY Name |
allerdings spuckt er mir so nur ein Feld mit dem Namen aus, nicht alle 3.
allerdings scheint die Sortierung so geklappt zu haben.... nun habe ich die VertragsabschlussID's und kann die einfach anhand eines zweiten Datasets Stück für Stück abarbeiten... Geht zwar bestimmt noch einfacher, aber wenigstens habe ich jetzt schonmal einen Lösungsweg.
Vielen Dank schonmal soweit, aber falls jemand weiss wie ich dies mit einer einzigen SQL Anweisung (einem einzigen Dataset) hinbekomme, wäre das natürlich noch besser 
|
|