Zelleninhalt als Teil eines Spaltennamens benutzen

Zelleninhalt als Teil eines Spaltennamens benutzen

am 18.02.2006 20:47:13 von Holger Pollmann

Hallo,

ich habe folgendes Problem:

für ein UPDATE-Statement der Form
UPDATE table SET ...=...+5 WHERE id=1
muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der sich
dummerweise aus einem fixen Bestandteil sowie dem Inhalt einer Zelle in
der jeweils manipulierten Zeile zusammensetzt.

Beispiel:
ich habe zwei Spalten name_1 und name_2. Außerdem habe ich eine Spalte
aktueller_name.
wenn aktueller_name den Wert 1 enthält, will ich name_1 ändern, wenn 2
drinsteht, will ich name_2 ändern.

Gibt's eine Möglichkeit, das in einem einzelnen Statement zu machen (das
ganze wird aus PHP aufgerufen, aber ich will's grad NICHT in PHP machen,
um einen Zugriff einzusparen)?

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 18.02.2006 23:37:52 von Axel Schwenke

Holger Pollmann wrote:

> ich habe folgendes Problem:
>
> für ein UPDATE-Statement der Form
> UPDATE table SET ...=...+5 WHERE id=1
> muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der sich
> dummerweise aus einem fixen Bestandteil sowie dem Inhalt einer Zelle in
> der jeweils manipulierten Zeile zusammensetzt.

Dein Datenmodell ist nicht normalisiert.

> Beispiel:
> ich habe zwei Spalten name_1 und name_2. Außerdem habe ich eine Spalte
> aktueller_name.
> wenn aktueller_name den Wert 1 enthält, will ich name_1 ändern, wenn 2
> drinsteht, will ich name_2 ändern.

Für gewöhnlich speichert man in _einer_ Tabelle nur Objekte des
_gleichen_ Typs. Normalisiere dein Modell und alles wird gut!


XL

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 20.02.2006 01:15:03 von Holger Pollmann

Axel Schwenke schrieb:

>> für ein UPDATE-Statement der Form
>> UPDATE table SET ...=...+5 WHERE id=1
>> muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der
>> sich dummerweise aus einem fixen Bestandteil sowie dem Inhalt
>> einer Zelle in der jeweils manipulierten Zeile zusammensetzt.
>
> Dein Datenmodell ist nicht normalisiert.

Mein Fehler, ich sehe es ein, ich hätte dazuschreiben sollen:

Bitte keine Vorschläge zur Änderung der Datenbankstruktur, diese kann
nicht verändert werden und steht daher nicht zur Debatte.

Insofern hilft mir deine Antwort, sehr gut gemeint, leider überhaupt nicht
weiter, weil sie nicht das Problem adressiert, sondern eine Prämisse.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl. Der
Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 10:12:05 von Holger Pollmann

Holger Pollmann schrieb:

> für ein UPDATE-Statement der Form
> UPDATE table SET ...=...+5 WHERE id=1
> muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der
> sich dummerweise aus einem fixen Bestandteil sowie dem Inhalt einer
> Zelle in der jeweils manipulierten Zeile zusammensetzt.
>
> [...]
>
> Gibt's eine Möglichkeit, das in einem einzelnen Statement zu machen
> (das ganze wird aus PHP aufgerufen, aber ich will's grad NICHT in
> PHP machen, um einen Zugriff einzusparen)?

Hmmm... bedeutet die Tatsache, daß außer Axel niemand was geschrieben
hat, daß ich hier falsch bin, daß es keine Lösung gibt oder daß ich meine
Frage nur irgendwie unverständlich formuliert habe?

Vielleicht kann mir ja jemand ein Stichwort sagen, mit dessen Hilfe ich
mir die Lösung selbst ergoogeln kann? Das wäre sehr nett.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 10:25:08 von Kai Ruhnau

Holger Pollmann wrote:
> Holger Pollmann schrieb:
>
>> für ein UPDATE-Statement der Form
>> UPDATE table SET ...=...+5 WHERE id=1
>> muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der
>> sich dummerweise aus einem fixen Bestandteil sowie dem Inhalt einer
>> Zelle in der jeweils manipulierten Zeile zusammensetzt.
>>
>> [...]
>>
>> Gibt's eine Möglichkeit, das in einem einzelnen Statement zu machen
>> (das ganze wird aus PHP aufgerufen, aber ich will's grad NICHT in
>> PHP machen, um einen Zugriff einzusparen)?
>
> Hmmm... bedeutet die Tatsache, daß außer Axel niemand was geschrieben
> hat, daß ich hier falsch bin, daß es keine Lösung gibt oder daß ich meine
> Frage nur irgendwie unverständlich formuliert habe?
>
> Vielleicht kann mir ja jemand ein Stichwort sagen, mit dessen Hilfe ich
> mir die Lösung selbst ergoogeln kann? Das wäre sehr nett.

Nein, falsch bist du hier nicht, es gibt nur keine Lösung innerhalb SQL.

Du benutzt ein nicht normalisiertes Datenmodell und erwartest eine
Lösung von etwas, das darauf ausgelegt ist, mit normalisierten Daten zu
arbeiten (und das dann auch ganz hervoragend löst!).

Die Bestrafung für kaputte Daten ist ein gesteigerter Aufwand in der
Applikation. Das war immer so und wird immer so bleiben.

Mach die Daten richtig und du hast keine Probleme, oder lebe halt damit,
dass du in der Applikation einen Zugriff mehr hast.

Grüße
Kai

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 11:13:19 von Holger Pollmann

Kai Ruhnau schrieb:

>> Vielleicht kann mir ja jemand ein Stichwort sagen, mit dessen Hilfe
>> ich mir die Lösung selbst ergoogeln kann? Das wäre sehr nett.
>
> Nein, falsch bist du hier nicht, es gibt nur keine Lösung innerhalb
> SQL.
>
> Du benutzt ein nicht normalisiertes Datenmodell und erwartest eine
> Lösung von etwas, das darauf ausgelegt ist, mit normalisierten Daten
> zu arbeiten (und das dann auch ganz hervoragend löst!).

Ich bin kein Datenbankexperte und habe darum nicht sonderlich viel
Ahnung. Ich mußte daher erst einmal nachlesen, was Normalisierung von
Datenmodellen eigentlich bedeuten.

Die Datenbank enthält einzelne Zeilen, die für verschiedene reale
Einheiten stehen, die beschrieben werden. Es gibt einen
Identifikationsschlüssel, und alle weiteren Elemente sind tatsächlich
voneinander unabhängig.

Jede einzelne beschriebene Einheit repräsentiert bspw. eine
Fertigungsstraße, die in der Lage ist, zwei verschiedene Arten von
Produkten herzustellen, aber immer nur eine Art zur selben Zeit. Daher
wird einmal in der Spalte anzahl_a die Anzahl der hergestellen Produkte
vom Typ a gezählt, in der Spalte anzahl_b die Anzahl der hergestellten
Produkte vom Typ b. Da die Straße immer nur einen Typ gleichzeitig
herstellen kann, gibt es außerdem die Spalte aktuelles_produkt, in der
gespeichert ist, welches Produkt die Straße gerade herstellt.

Sinn des ganz ist nun, daß man z.B. nach jeder Herstellung eines neuen
Werkstücks die Datenbank mit einem Statement wie dem folgenden aufruft:
UPDATE fertigungsstrassen SET anzahl_a = anzahl_a + 1 WHERE id=5
Dafür müßte der Aufrufende aber wissen, was gerade hergestellt wird,
müßte also erst einmal
SELECT aktuelles_produkt FROM fertigungsstrassen WHERE id=5
machen.

Ich wollte jetzt sowas (Achtung, keine SQL-Notation) wie#
UPDATE fertigungsstrassen
SET anzahl_(aktuelles_produkt) = anzahl_(aktuelles_produkt) + 1
WHERE id=5
machen, damit ich mir die SELECT-Abfrage sparen kann - ICH brauche ja
eigentlich den Inhalt der Spalte aktuelles_prodult nur dafür, das UPDATE-
Statement zusammenzusetzen.

M.E. ist eine Relation der Form

id | aktuelles_produkt | anzahl_a | anzahl_b
--------------------------------------------
5 | a | 4000 | 3000

unproblematisch in der 1. Normalform, weil jede Information atomar ist -
es sind nicht mehrere Informationen in einer SPalte (das wäre z.B. eine
Spalte anzahl, die so etwas wie 4000|3000 enthielte).

M.E. hat sie auch die 2. Normalform, denn jedes Element hängt nur vom
Identifikationsschlüssel ab - die Anzahl der Werkstücke vom Typ a hängt
in keiner Weise vom Typ b ab oder davon, welche Produkte MOMENTAN
hergestellt werden; die ERHÖHUNG der Anzahl braucht diese Information,
aber nicht die Anzahl selbst. Das selbe gilt natürlich für die Anzahl der
Produkte vom Typ b. Und daß die momentane Einstellung der
Fertigungsstraße auf einen Produkttyp nicht an der Anzahl der bisher
hergestellten Produkte hängt, ist m.E. auch offensichtlich.

M.E. hat sie auch die 3. Normalform, denn keine der Informationen hängt
transitiv vom Identifikationsschlüssel ab; wie eben beschrieben, sind es
alles unabhängige Werte.

Ich las irgendwo, daß es noch sechs weitere Normalformen gibt, aber es
heißt immer, in der Praxis würde die dritte Form reichen. Nun, die hat
sie, oder liege ich da falsch?

Muß ich das ganze wirklich aufteilen in zwei Relationen

id | anzahl_a | anzahl_b
--------------------------------------------
5 | 4000 | 3000

id | aktuelles_produkt
----------------------
5 | a

? Das erscheint mir so... sinnlos...

Und das Problem daran ist: es würde mir wirklich nicht weiterhelfen, denn
selbst, wenn ich unproblematisch den zugehörigen Spaltennamen bekomme,
steht immer noch die Frage im Raum, wie ich aus dem bekannten Bestandteil
"anzahl_" und dem Datum "aktuelles_produkt" in einem SQL-Statement so
etwas wie "anzahl_a" oder "anzahl_b" mache, wuasi ein
"Stringverkettungsproblem".

> Mach die Daten richtig und du hast keine Probleme, oder lebe halt
> damit, dass du in der Applikation einen Zugriff mehr hast.

Ich hoffe, jetzt ist irgendwie klarer geworden, was ich will.

Mal abgesehen davon, daß das "Stringverkettungsproblem" zu lösen ist:
kann man die beiden Abfragen in SQL irgenwie zusammenfassen? Ich habe
bisher immer nur einzelne Statements benutzt, meine ich aber erinnern zu
können, daß MySQL (ich benutze 4.1.14, soweit ich das richtig sehe) das
auch kann, aber ich bin mir nicht sicher.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 13:02:52 von Thomas Rachel

Holger Pollmann wrote:

> Muß ich das ganze wirklich aufteilen in zwei Relationen
>
> id | anzahl_a | anzahl_b
> --------------------------------------------
> 5 | 4000 | 3000
>
> id | aktuelles_produkt
> ----------------------
> 5 | a
>
> ? Das erscheint mir so... sinnlos...

Nein, aber

fertigungsstrassen
id | produkt | anzahl
---------------------
5 | a | 4000
5 | b | 3000

und

aktuell
id | produkt
------------
5 | a

würde Dein Problem lösen.

Dann machst Du

UPDATE fertigungsstrassen join aktuell using (id,produkt) SET anzahl =
anzahl + 1 WHERE fertigungsstrassen.id=5

(oder alternativ auch WHERE aktuell.id=5)


HTH,

Thomas

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 14:12:44 von Axel Schwenke

Holger Pollmann wrote:
> Kai Ruhnau schrieb:
>
>> falsch bist du hier nicht, es gibt nur keine Lösung innerhalb SQL.
>>
>> Du benutzt ein nicht normalisiertes Datenmodell und erwartest eine
>> Lösung von etwas, das darauf ausgelegt ist, mit normalisierten Daten
>> zu arbeiten (und das dann auch ganz hervoragend löst!).
>
> Ich bin kein Datenbankexperte und habe darum nicht sonderlich viel
> Ahnung. Ich mußte daher erst einmal nachlesen, was Normalisierung von
> Datenmodellen eigentlich bedeuten.

Darf ich dem entnehmen, daß dein

> Bitte keine Vorschläge zur Änderung der Datenbankstruktur, diese kann
> nicht verändert werden und steht daher nicht zur Debatte.

nicht wirklich ernst gemeint war?


[ längliche Erklärung ]

> UPDATE fertigungsstrassen
> SET anzahl_(aktuelles_produkt) = anzahl_(aktuelles_produkt) + 1
> WHERE id=5
> machen, damit ich mir die SELECT-Abfrage sparen kann - ICH brauche ja
> eigentlich den Inhalt der Spalte aktuelles_prodult nur dafür, das UPDATE-
> Statement zusammenzusetzen.

Das ist was anderes, das kann man in reinem SQL lösen. Der Trick ist,
beide Spalten zu verändern, aber einen Ausdruck zu verwenden, der von
der dritten Spalte abhängig ist:

UPDATE fertigungsstrssen
SET anzahl_a = anzahl_a + (CASE aktuelles_produkt WHEN 'a' THEN 1 ELSE 0 END),
SET anzahl_b = anzahl_b + (CASE aktuelles_produkt WHEN 'b' THEN 1 ELSE 0 END)
WHERE id = 5;


Dessen ungeachtet würde ich dir trotzdem empfehlen, zu normalisieren,
denn diese Aussage:

> id | aktuelles_produkt | anzahl_a | anzahl_b
> --------------------------------------------
> 5 | a | 4000 | 3000
>
> unproblematisch in der 1. Normalform

stimmt so allgemein nicht. Vielleicht kommen ja nächstes Jahr neue
Fertigungsstraßen, die 3 oder 4 verschiedene Produkte herstellen
können. Der Indikator für einen Fehler in deinem Modell ist, daß Daten
(der String in Spalte `aktuelles_produkt`) und Spaltenbezeichner
(`anzahl_a`, `anzahl_b`) korrespondieren.

Korrekt normalisiert würde man `anzahl_X` in eine weitere Tabelle
auslagern und X als Schlüssel verwenden. So wie Thomas Rachel das
in vorschlägt.


XL

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 14:33:19 von Christian Kirsch

Holger Pollmann wrote:

> Die Datenbank enthält einzelne Zeilen, die für verschiedene reale
> Einheiten stehen, die beschrieben werden. Es gibt einen
> Identifikationsschlüssel, und alle weiteren Elemente sind tatsächlich
> voneinander unabhängig.
>
> Jede einzelne beschriebene Einheit repräsentiert bspw. eine
> Fertigungsstraße, die in der Lage ist, zwei verschiedene Arten von
> Produkten herzustellen, aber immer nur eine Art zur selben Zeit. Daher
> wird einmal in der Spalte anzahl_a die Anzahl der hergestellen Produkte
> vom Typ a gezählt, in der Spalte anzahl_b die Anzahl der hergestellten
> Produkte vom Typ b.

So ein Design ist schon deshalb kapott, weil Du es ändern musst, wenn
die Straße irgendwann mal drei Produkte herstellt.

Für solche Fälle bemüht man einfach eine *weitere* Tabelle, mit (z.B.
den Spalten 'Fertigungsstrasse', 'Produktname', 'Produziert_seit',
'Produziert_bis', 'Anzahl'.

> Da die Straße immer nur einen Typ gleichzeitig
> herstellen kann, gibt es außerdem die Spalte aktuelles_produkt, in der
> gespeichert ist, welches Produkt die Straße gerade herstellt.
>
> Sinn des ganz ist nun, daß man z.B. nach jeder Herstellung eines neuen
> Werkstücks die Datenbank mit einem Statement wie dem folgenden aufruft:
> UPDATE fertigungsstrassen SET anzahl_a = anzahl_a + 1 WHERE id=5

UPDATE foo SET Anzahl = Anzahl+1 WHERE ID=5 AND Produziert_seit <= NOW()
AND Produziert_bis IS NULL

Oder so ähnlich.

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 14:58:46 von Dirk Brosowski

Holger Pollmann schrieb:
>
> Ich bin kein Datenbankexperte und habe darum nicht sonderlich viel
> Ahnung. Ich mußte daher erst einmal nachlesen, was Normalisierung von
> Datenmodellen eigentlich bedeuten.

Das ist relativ normal, sowas kann sich ändern.

Ich weiss aber nicht genau, warum sich hier aber noch jemand Mühe gibt.
Axel hat dir den einzig brauchbaren Tipp gegeben, den du aber nicht
umsetzen kannst oder willst oder darfst.

Wozu jemand die Normalform hier reinbringt, weiss ich nicht. Ich weiss
nur, dass man dazu kein sinnvolles ER-Diagram angeben kann.

Und damit sehe ich das als reines Applikationsproblem, viel Spass beim
lösen.

Grüße

Dirk

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 15:19:52 von Holger Pollmann

Axel Schwenke schrieb:

>> Ich bin kein Datenbankexperte und habe darum nicht sonderlich viel
>> Ahnung. Ich mußte daher erst einmal nachlesen, was Normalisierung
>> von Datenmodellen eigentlich bedeuten.
>
> Darf ich dem entnehmen, daß dein
>
>> Bitte keine Vorschläge zur Änderung der Datenbankstruktur, diese
>> kann nicht verändert werden und steht daher nicht zur Debatte.
>
> nicht wirklich ernst gemeint war?

Doch. Denn wenn die einzige Möglichkeit, das zu erreichen, in einer
Änderung der Datenbankstruktur bestünde, dann weiß ich Bescheid - dann
muß ich's so machen wie bisher.

Aber das andere war ernstgemeint: ich mußte mir nach deiner Antwort
erstmal anlesen, was Datenmodellnormalisierung bedeutet. Ich gebe zu, daß
meine bisherige Herangehensweise an Datenbanken eher praxisorientiert
war; ich habe mir halt selbst beigebracht, was ich so brauche.

Die Struktur der Datenbank hier ist vorgegeben, ich kann sie nicht
ändern.

> [ längliche Erklärung ]

Sorry, aber bevor ich's zu kurz erkläre und Mißverständnisse auftreten...

>> UPDATE fertigungsstrassen
>> SET anzahl_(aktuelles_produkt) = anzahl_(aktuelles_produkt) + 1
>> WHERE id=5
>> machen, damit ich mir die SELECT-Abfrage sparen kann - ICH brauche
>> ja eigentlich den Inhalt der Spalte aktuelles_produkt nur dafür,
>> das UPDATE- Statement zusammenzusetzen.
>
> Das ist was anderes, das kann man in reinem SQL lösen. Der Trick
> ist, beide Spalten zu verändern, aber einen Ausdruck zu verwenden,
> der von der dritten Spalte abhängig ist:
>
> UPDATE fertigungsstrssen
> SET anzahl_a = anzahl_a + (CASE aktuelles_produkt WHEN 'a' THEN 1
> ELSE 0 END), SET anzahl_b = anzahl_b + (CASE aktuelles_produkt
> WHEN 'b' THEN 1 ELSE 0 END)
> WHERE id = 5;

Ahhh... geschickte Idee. Da wäre ich in längerer Zeit nicht
draufgekommen.

Darf ich dem aber entnehmen, daß es generell keine einfache Möglichkeit
gibt, mittels SQL selbst eine Zeichenkette herzustellen und die fertige
Zeichenkette als Spaltennamen zu verwenden?

(Nur, um das klarzumachen: ich sehe ein, daß eine Änderung der Struktur
praktisch wäre, es steht halt nur nicht zur Debatte. Sollte mir sowas
aber in Zukunft begegnen und modifizierbar sein, würde ich's anders
machen.)

> Dessen ungeachtet würde ich dir trotzdem empfehlen, zu
> normalisieren, denn diese Aussage:
>
>> id | aktuelles_produkt | anzahl_a | anzahl_b
>> --------------------------------------------
>> 5 | a | 4000 | 3000
>>
>> unproblematisch in der 1. Normalform
>
> stimmt so allgemein nicht. Vielleicht kommen ja nächstes Jahr neue
> Fertigungsstraßen, die 3 oder 4 verschiedene Produkte herstellen
> können. Der Indikator für einen Fehler in deinem Modell ist, daß
> Daten (der String in Spalte `aktuelles_produkt`) und
> Spaltenbezeichner (`anzahl_a`, `anzahl_b`) korrespondieren.

Wie man's nimmt. Man mag das jetzt für ketzerisch halten, aber wenn neue
Produktformen hinzukommen, bekommt die Tabelle halt entsprechende Spalten
mehr, deren default-Wert auf NULL gesetzt wird - dann stimmt die ANgabe
erstmal für alle Tabellen.

Im übrigen aber war das ganze nur ein Beispiel; es geht nich tum
Fertigungsstraßen ;-)

> Korrekt normalisiert würde man `anzahl_X` in eine weitere Tabelle
> auslagern und X als Schlüssel verwenden. So wie Thomas Rachel das
> in vorschlägt.

Die Lösung hat eine nicht abzustreitende Eleganz, in der Tat.

Mal davon abgesehen, daß ich trotz meiner jungen 26 Jahre aus einer Zeit
komme, wo man Datenstrukturen möglichst klein halten mußte und ich daher
eine nichtrationale Abneigung gegen eine Inflation von Tabellen habe, die
sich nur durch viel Vernunft ausgleichen läßt - aber ich sehe durchaus
ein, daß das eine sehr schöne Lösung ist.

(Geht halt nur hier nicht.)

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 15:26:38 von Holger Pollmann

Dirk Brosowski schrieb:

>> Ich bin kein Datenbankexperte und habe darum nicht sonderlich viel
>> Ahnung. Ich mußte daher erst einmal nachlesen, was Normalisierung
>> von Datenmodellen eigentlich bedeuten.
>
> Das ist relativ normal, sowas kann sich ändern.

Ist da jetzt ein Witz drin, der aus den begriffen "relativ" und "Normal"
zusammengesetzt ist und was mit der Tatsache zu tun hat, daß es um
Relationen geht - oder soll ich deine Aussage tatsächlich so verstehen,
daß es normal ist, wenn jemand nicht weiß, was "Normalisierung von
Datenmodellen" bedeutet?

> Ich weiss aber nicht genau, warum sich hier aber noch jemand Mühe
> gibt.

Möglicherweise liegt es daran, daß die Antwortenden interessiert am
Problem sind und bei der Gelegenheit jemandem, der erkennbar Interesse
daran zeigt zu verstehen, was es mit der dahinterstehenden Theorie auf
sich hat, was beizubringen?

Ich bin sehr dankbar dafür, denn von einigen Ausnahmen abgesehen kann man
m.E. nicht zuviel Wissen, und gerade für Vorüberlegungen zur Definition
von Strukturen kann man Hintergrundwissen immer gebrauchen. Beim
momentanen Projekt nutzt es zwar nix, weil ich die Struktur nicht ändern
kann, aber das heißt ja nicht, daß ich das neu erworbene Wissen um die
Normalisierung nicht in Zukunft gewinnbringend einsetzen kann.

> Axel hat dir den einzig brauchbaren Tipp gegeben, den du aber
> nicht umsetzen kannst oder willst oder darfst.

Das Dürfen ist primär das Problem. Und interessanterweise hat derselbe
Axel jetzt einen weiteren Hinweis gegeben, der mein momentanes Problem
zufriedenstellend löst.

> Wozu jemand die Normalform hier reinbringt, weiss ich nicht.

Vermutlich, weil er das für die richtige Begründung hält, weshalb es ein
Problem darstellt.

> Ich weiss nur, dass man dazu kein sinnvolles ER-Diagram angeben
> kann.

Ich wiederum habe keine Ahnung, was ein ER-Diagram ist und insbesondere
nicht, ob man das wirklich so bezeichnet oder nicht doch noch ein m
anhängt...

> Und damit sehe ich das als reines Applikationsproblem, viel Spass
> beim lösen.

Habe ich gehabt.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 16:23:53 von Andreas Sakowski

Hallo.

"Holger Pollmann" schrieb
> für ein UPDATE-Statement der Form
> UPDATE table SET ...=...+5 WHERE id=1
> muß ich da, wo die Punkte stehen, einen Spaltennamen angeben, der
> sich
> dummerweise aus einem fixen Bestandteil sowie dem Inhalt einer Zelle
> in
> der jeweils manipulierten Zeile zusammensetzt.
>
> Beispiel:
> ich habe zwei Spalten name_1 und name_2. Außerdem habe ich eine
> Spalte
> aktueller_name.
> wenn aktueller_name den Wert 1 enthält, will ich name_1 ändern, wenn
> 2
> drinsteht, will ich name_2 ändern.

Das was gut ist hast Du ja schon gehört. Das was Du haben möchtest
könnte
eventuell folgendes sein:

update table set
name_1 = if( aktueller_name = '1' , name_1 + 5 , name_1 )
, name_2 = if( aktueller_name = '2' , name_2 + 5 , name_2 )
where
id = 1 ;

Gruß
Andreas

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 20:28:24 von Dirk Brosowski

Holger Pollmann schrieb:
> Darf ich dem aber entnehmen, daß es generell keine einfache Möglichkeit
> gibt, mittels SQL selbst eine Zeichenkette herzustellen und die fertige
> Zeichenkette als Spaltennamen zu verwenden?

Genau.
>
> Mal davon abgesehen, daß ich trotz meiner jungen 26 Jahre aus einer Zeit
> komme, wo man Datenstrukturen möglichst klein halten mußte und ich daher
> eine nichtrationale Abneigung gegen eine Inflation von Tabellen habe, die
> sich nur durch viel Vernunft ausgleichen läßt - aber ich sehe durchaus
> ein, daß das eine sehr schöne Lösung ist.

Nein, die Lösung ist weder elegant noch schön. Das ist nur eine
Notfallmaßnahme um dein Problem zu beheben.

Zum Thema Datenstrukturen klein halten. Die vorhandene Lösung ist da auf
jeden Fall schlechter. Da bin ich mir ziemliiich sicher.

Grüße

Dirk

Re: Zelleninhalt als Teil eines Spaltennamens benutzen

am 21.02.2006 20:33:54 von Holger Pollmann

Dirk Brosowski schrieb:

>> Mal davon abgesehen, daß ich trotz meiner jungen 26 Jahre aus
>> einer Zeit komme, wo man Datenstrukturen möglichst klein halten
>> mußte und ich daher eine nichtrationale Abneigung gegen eine
>> Inflation von Tabellen habe, die sich nur durch viel Vernunft
>> ausgleichen läßt - aber ich sehe durchaus ein, daß das eine sehr
>> schöne Lösung ist.
>
> Nein, die Lösung ist weder elegant noch schön. Das ist nur eine
> Notfallmaßnahme um dein Problem zu beheben.

Ich meinte die von Thomas Rachel vorgeschlagene Lösung.

> Zum Thema Datenstrukturen klein halten. Die vorhandene Lösung ist
> da auf jeden Fall schlechter. Da bin ich mir ziemliiich sicher.

Inwiefern? Insbesondere wenn man bedenkt, daß ich hier eine theoretische
Struktur beschrieben habe und nicht einen tatsächliche - die tatsächliche
sieht nämlich anders aus.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl. Der
Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003