Entwickler-Ecke

Datenbanken - Union vermeiden


D. Annies - Sa 24.08.13 07:55
Titel: Union vermeiden
Hi, Delpher,

Ich will in einer DBTabelle die verschiedenen Feldinhalte, hier verschiedene WPK-Bezeichnungen,
finden. Bisher hat der Befehl auch funktioniert, aber jetzt bekomme ich einen Indexfehler.

wie kann ich den folgenden SQL-Befehl bei gleicher Leistung so ändern, dass kein Union mehr darin vorkommt?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
SQL.Text := format('select distinct WPK1NAME as WPK from "%s" ', [TbSchueler.tablename]) +
                   'union ' +
            format('select distinct WPK2NAME as WPK from "%s" ', [TbSchueler.tablename]) +
                   'union ' +                                                                // Indexfehler bei Union
            format('select distinct WPK3NAME as WPK from "%s" ', [TbSchueler.tablename]) +
                   'union ' +
            format('select distinct WPK4NAME as WPK from "%s" ', [TbSchueler.tablename]);


Danke für eure Hilfe,
Detlef


jaenicke - Sa 24.08.13 09:34

Falls du immer noch die BDE nutzt, wüsste ich keine Möglichkeit das zu erreichen.
Bei echtem SQL sollte da etwas mit JOINs und COALESCE machbar sein denke ich. (So joinen, dass die Zeilen untereinander landen und dann mit coalesce jeweils die erste Spalte ungleich Null nehmen.)


Xion - Sa 24.08.13 12:05

Was genau ist denn ein Indexfehler bei Union? Kannst du mal den genauen Fehler posten?

Alternativ könnte man es ja auch von Hand vereinigen, da du distinct ohnehin nur in den Untertabellen verwendest.

Eine andere Frage wäre, ob man vielleicht das Schema umbauen sollte...scheint mir an der Stelle nicht sauber normalisiert zu sein (was sind WPK?).


WasWeißDennIch - Sa 24.08.13 12:45

Bei durchnummerierten Feldnamen schrillen auch bei mir gleich die Alarmglocken, da sie oft auf unzureichende Normalisierung hindeuten. Was bedeuten die Felder denn?


Martok - Sa 24.08.13 13:11

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Bei durchnummerierten Feldnamen schrillen auch bei mir gleich die Alarmglocken, da sie oft auf unzureichende Normalisierung hindeuten. Was bedeuten die Felder denn?
WahlPflichtKurs würde ich schätzen. Das kann man schon so machen, da es immer exakt 4 sind. Dass da allerdings die Namen drinstehen statt einer ID ist wirklich nicht schön. Wäre das ordentlich, wäre die Abfrage hier ein select * from Kursliste...


WasWeißDennIch - Sa 24.08.13 13:39

Eben, ggf. noch mit einem INNER JOIN auf Tbschueler und Gruppierung, dann hätte man wohl das gewünschte Ergebnis.


D. Annies - Mo 26.08.13 10:25

Hi, Delpher,

also es wirkt wie durchnummerierte Felder, sind aber wirklich nur Bezeichnungen.
Ich habe, da ich jetzt eine Fallunterscheidung machen muss (die WPK's sind wie die
Realschulen in SH ja vom Kultusmysterium abgeschafft worden und heißen jetzt WPU)
eine Lösung gefunden, die zu funktionieren scheint:

Wenn es eine Vorjahrestabelle ist, prüfe ich 4 mal auf <> NIL.
Bei der diesjährigen Tabelle prüfe ich einmal auf <> NIL und dreimal auf = NIL ---> funzt.

Es ist aber jetzt ein neues Problem aufgetreten, dass ich separat darstellen werde, geht gleich los.

Danke noch einmal
Detlef