Entscheidung in einem UPDATE-Befehl
am 29.08.2006 10:08:36 von benjamin235
Hallo Leute!
Ich hab da echt ein Problem, das ziemlich verwirrend ist. Vielleicht
könnt ihr mir da helfen. Also ich versuch euch das mal zu erklären.
Ich programmiere C unter Linux mit MySQL. So und nun zu der Erklärung.
Also ich habe in meinem Programm 4 Tabellen, in denen Infos stehen, die
ich benötige. Die Tabellen sehen so aus:
Tabelle 1 (ist die auf der der UPDATE-Befehl angewendet werden soll):
TYPE SRC_IP SRC_NAS LN_Country LN_Operator
Request 192.168.0.1 Deutschland Deutsch
Request 192.168.0.2
Request 192.168.0.3
...
Tabelle 2:
IP Name WBA MCC MNC
192.168.0.1 TMEU 2 12 14
192.168.0.2 TMUS 2 16 22
...
Tabelle 3:
LN_Operator LN_Country MCC MNC
Deutsch Deutschland 12 14
Ami USA 16 22
...
Tabelle 4:
Betreiber MCC MNC
Telekom 12 14
O2 16 22
...
So das ist also der Aufbau der Tabellen. Jetzt will ich folgendes: Ich
muss in Tabelle 1 das Feld SRC_NAS befüllen. Die Kriterien dafür sind
folgende: Zuerst muss in Tabelle 2 nachgesehen werden ob WBA =3D 2.
Sollte dies der Fall sein, muss in Tabelle 1 nachgesehen werden ob TYPE
=3D Request und dann bei Tabelle 1 ob in LN_Country und LN_Operator etwas
steht. Sollte da etwas stehen, dann muss dieser Inhalt mit den Spalten
von Tabelle 3 verglichen werden und dann die MCC und die MNC (die aus
Tabelle 1 und Tabelle 3) verglichen werden mit den MCC und MNC aus
Tabelle 4. Wenn die zutreffen, dann muss aus Tabelle 4 der
Betreibername in Tabelle 1 unter SRC_NAS eingetragen werden. So das ist
das erste Kriterium. Und jetzt kommt das zweite. Sollte nämlich in
Tabelle 2 WBA =3D 2 sein, aber in Tabelle 1 unter LN_Operator und
LN_Country nichts stehen, dann muss die Spalte SRC_IP unter Tabelle 1
mit der IP in Tabelle 2 verglichen werden und wenn die übereinstimmen
muss der MCC und der MNC aus Tabelle 2 mit Tabelle 4 verglichen werden
und der Betreiber (bei dem MNC und MCC gleich sind) ind die Tabelle 1
unter SRC_NAS eingetragen werden.
Das ist also das Kriterium. Nur ich check nicht ganz wie ich das machen
soll. Ich hab auch schon nen Ansatz, der aber nicht so ganz
funktioniert. Hier mal mein SQL_Befehl:
UPDATE tabelle1, tabelle2, tabelle3, tabelle4 SET tabelle1.SRC_NAS =3D
(SELECT CASE WHEN tabelle2.WBA =3D 2 AND tabelle1.TYPE =3D 'Request' AND
tabelle1.LN_Operator =3D tabelle3.LN_Operator AND tabelle1.LN_Country =3D
tabelle3.LN_Country THEN tabelle3.MCC =3D tabelle4.MCC AND tabelle3.MNC =3D
tabelle4.MNC ELSE tabelle1.SRC_IP =3D tabelle2.IP AND tabelle2.MCC =3D
tabelle4.MCC AND tabelle2.MNC =3D tabelle4.MNC)
Da fehlt was, nur ich weiß nicht genau was. Könnt ihr mir da helfen?
Habt ihr vielleicht nen Ansatz, der leichter gehen könnte als SELECT
CASE? Bin für jede Hilfe dankbar.
Gruß Benjamin
PS.: Ich hoffe ich konnte es verständlich posten!
Re: Entscheidung in einem UPDATE-Befehl
am 29.08.2006 10:31:47 von Christian Kirsch
benjamin235@web.de schrieb:
> Hallo Leute!
>
> Ich hab da echt ein Problem, das ziemlich verwirrend ist. Vielleicht
> könnt ihr mir da helfen. Also ich versuch euch das mal zu erklären.
> Ich programmiere C unter Linux mit MySQL. So und nun zu der Erklärung.
> Also ich habe in meinem Programm 4 Tabellen, in denen Infos stehen, die
> ich benötige. Die Tabellen sehen so aus:
>
> Tabelle 1 (ist die auf der der UPDATE-Befehl angewendet werden soll):
>
> TYPE SRC_IP SRC_NAS LN_Country LN_Operator
> Request 192.168.0.1 Deutschland Deutsch
>
> Request 192.168.0.2
>
> Request 192.168.0.3
>
> ...
>
> Tabelle 2:
>
> IP Name WBA MCC MNC
> 192.168.0.1 TMEU 2 12 14
> 192.168.0.2 TMUS 2 16 22
> ...
>
> Tabelle 3:
>
> LN_Operator LN_Country MCC MNC
> Deutsch Deutschland 12 14
> Ami USA 16 22
> ...
>
> Tabelle 4:
>
> Betreiber MCC MNC
> Telekom 12 14
> O2 16 22
> ...
>
>
> So das ist also der Aufbau der Tabellen. Jetzt will ich folgendes: Ich
> muss in Tabelle 1 das Feld SRC_NAS befüllen. Die Kriterien dafür sind
> folgende: Zuerst muss in Tabelle 2 nachgesehen werden ob WBA = 2.
Meinst Du "Zuerst muss man Datensatz in Tabelle 2 identifizieren, bei
dem die IP mit der in Tabelle 1 übereinstimmt und im Feld WBA eine 2
steht"? Oder meinst Du "Zuerst muss man irgendeinen Datensatz aus
Tabelle 2 finden, bei dem WBA eine 2 enthält"? Oder meinst Du was ganz
anderes?
> Sollte dies der Fall sein, muss in Tabelle 1 nachgesehen werden ob TYPE
> = Request und dann bei Tabelle 1 ob in LN_Country und LN_Operator etwas
> steht.
Meinst Du "Zuerst muss man für die Einträge, bei denen in Tabelle 1 im
Feld TYPE "Request" steht und die Felder LN_Country und LN_Operator
nicht leer sind, der passende Eintrag (im Sinne von identischen
IP-Adressen) in Tabelle 2 gefunden werden, bei dem das Feld WBA eine 2
enthält.
> Sollte da etwas stehen, dann muss dieser Inhalt mit den Spalten
> von Tabelle 3 verglichen werden und dann die MCC und die MNC (die aus
> Tabelle 1 und Tabelle 3) verglichen werden mit den MCC und MNC aus
> Tabelle 4.
Du suchst also jetzt welchen Datensatz aus welcher Tabelle? Was Du
hier beschreibst, hat m.E. wenig mit SQL zu tun - warum löst Du es
nicht exakt so, wie Du es beschreibst, in Deinem C-Programm? Du willst
doch offensichtlich prozedural und nicht deklarativ programmieren -
mach es doch einfach.
> Wenn die zutreffen, dann muss aus Tabelle 4 der
Wenn was zutrifft? Welche Daten willst Du denn nun aus welcher Tabelle
haben? Welches sind die Schlüssel?
> Betreibername in Tabelle 1 unter SRC_NAS eingetragen werden. So das ist
> das erste Kriterium. Und jetzt kommt das zweite. Sollte nämlich in
> Tabelle 2 WBA = 2 sein, aber in Tabelle 1 unter LN_Operator und
> LN_Country nichts stehen, dann muss die Spalte SRC_IP unter Tabelle 1
> mit der IP in Tabelle 2 verglichen werden
Ah. Und im ersten Fall? Wie identifizierst Du da die zueinander
gehörenden Datensätze? Wie sieht denn das Modell dieser Daten
überhaupt aus?
> und wenn die übereinstimmen
> muss der MCC und der MNC aus Tabelle 2 mit Tabelle 4 verglichen werden
> und der Betreiber (bei dem MNC und MCC gleich sind) ind die Tabelle 1
> unter SRC_NAS eingetragen werden.
> Das ist also das Kriterium. Nur ich check nicht ganz wie ich das machen
> soll. Ich hab auch schon nen Ansatz, der aber nicht so ganz
> funktioniert. Hier mal mein SQL_Befehl:
>
> UPDATE tabelle1, tabelle2, tabelle3, tabelle4 SET tabelle1.SRC_NAS =
> (SELECT CASE WHEN tabelle2.WBA = 2 AND tabelle1.TYPE = 'Request' AND
> tabelle1.LN_Operator = tabelle3.LN_Operator AND tabelle1.LN_Country =
> tabelle3.LN_Country THEN tabelle3.MCC = tabelle4.MCC AND tabelle3.MNC =
> tabelle4.MNC ELSE tabelle1.SRC_IP = tabelle2.IP AND tabelle2.MCC =
> tabelle4.MCC AND tabelle2.MNC = tabelle4.MNC)
>
>
> Da fehlt was, nur ich weiß nicht genau was.
Da fehlt der Teil, der den Feldinhalt setzt. Außerdem wäre es
vermutlich einfacher, wenn Du zwei UPDATEs verwendest - Deine
Bedingungen sind ja anscheinend disjunkt.
Was vermutlich völlig fehlt, ist ein normalisiertes Datenmodell -
wieso tauchen identische MCC und MNC in drei Tabellen auf? Vermutlich
würde Dein überaus komplexes Problem zu etwas ziemlich simplem
zusammenschnurren, wenn Du ein vernünftiges Modell benutztest - z.B.
aus den Tabellen 2, 3 und 4 *eine* machtest, und sei es nur temporär.
> Könnt ihr mir da helfen?
> Habt ihr vielleicht nen Ansatz, der leichter gehen könnte als SELECT
> CASE? Bin für jede Hilfe dankbar.
>
> Gruß Benjamin
>
>
> P.S.: Ich hoffe ich konnte es verständlich posten!
>
Re: Entscheidung in einem UPDATE-Befehl
am 29.08.2006 11:08:08 von benjamin235
Hallo!
Also mir ist klar dass das sehr verwirrend ist. Zunächst mal zu der
Datenbank. Ich darf daran nichts verändern. So kann ich also nicht das
machen was vielleicht einfacher wäre. Der Punkt warum überall
identische MCC und MNCs stehen ist der, dass daraus eine eindeutige
Zuordnung herausgezogen werden kann.
Also ich will unter SRC_NAS einen Namen eintragen. Entweder den Namen
aus der Tabelle 3 oder aus der Tabelle 4. Das ist das Grundprinzip! Aus
Tabelle 3 kann ich den Namen nur nehmen, wenn in Tabelle 1 die Felder
LN_Operator und LN_Country befüllt sind. Solte dies nicht der Fall
sein, so wird die IP aus SRC_IP (bei Tabelle 1) mit der IP in Tabelle 2
verglichen. Gibt es eine Übereinstimmung, soll der MNC und MCC aus
Tabelle 2 mit dem MNC und MCC aus Tabelle 4 verglichen werden und dann
der Name aus Tabelle 4 in SRC_NAS in Tabelle 1 eingetragen werden.
Re: Entscheidung in einem UPDATE-Befehl
am 29.08.2006 11:35:09 von Christian Kirsch
benjamin235@web.de schrieb:
> Hallo!
>
> Also mir ist klar dass das sehr verwirrend ist. Zunächst mal zu der
> Datenbank. Ich darf daran nichts verändern. So kann ich also nicht das
> machen was vielleicht einfacher wäre. Der Punkt warum überall
> identische MCC und MNCs stehen ist der, dass daraus eine eindeutige
> Zuordnung herausgezogen werden kann.
"Ist kapott und muss kapott bleiben" mag sein, ist aber kein
tragfähiges Konzept für Software-Entwicklung. Vielleicht mag sich
jemand anders hier damit beschäftigen.
EOT für mich.
Re: Entscheidung in einem UPDATE-Befehl
am 29.08.2006 12:03:39 von benjamin235
Christian Kirsch schrieb:
> benjamin235@web.de schrieb:
> > Hallo!
> >
> > Also mir ist klar dass das sehr verwirrend ist. Zunächst mal zu der
> > Datenbank. Ich darf daran nichts verändern. So kann ich also nicht das
> > machen was vielleicht einfacher wäre. Der Punkt warum überall
> > identische MCC und MNCs stehen ist der, dass daraus eine eindeutige
> > Zuordnung herausgezogen werden kann.
>
> "Ist kapott und muss kapott bleiben" mag sein, ist aber kein
> tragfähiges Konzept für Software-Entwicklung. Vielleicht mag sich
> jemand anders hier damit beschäftigen.
>=20
>=20
>=20
> EOT für mich.
Naja danke für die Hilfe!