Mysql per odbc sql-Formulierungsrätsel

Hai, Leute,

also Zugriff und pipapo steht, es geht tatsächlich um die sql-Formulierung für eine Abfrage

Tab1:
ID geburtsname
1 Müller
2 Schmid

Tab2:
ID famst neuname abDatum
1 heira 01.01.2002
1 heira Meier 01.06.2002

also Fr. Müller hat am 1.1. geheiratet, aber trägt erst seit dem 1.6. den Namen ihres Mannes…
Ich brauch jetzt ein sql-Statement, das mir eine simple Liste aus ID und aktuellem Namen erzeugt, natürlich jeweils nur ein Eintrag

SELECT Distinct Tab1.id, Tab1.geburtsname, Tab2.neuname FROM Tab1, Tab2 where Tab1.id = Tab2.id

liefert mir

id geburtsname neuname
1 Müller
1 Müller Meier
2 Schmid

Wer kann mir verraten, wie ich das sql-Statement konstruieren muß, damit Fr. Meier, geb. Müller nur einmal auftaucht?
Mysql kennt keine Unterabfragen und auch last nicht.
Wenn ich gruppiere oder nach dem abDatum desc sortiere, krieg ich trotzdem immer nur den Datensatz ohne neuname-Eintrag

ratlosen Gruß
Sibylle

hallo

eine frage zu deinem problem bzgl. den namen,
ich kenne mich nicht mit mysql aus, arbeit auf oracle

kannst du in mysql einen view erstellen?

wenn ja dann probiere es mit views sonst kannst du dir da die 2 views
als tables anlegen, die du dann für die auswertung verwendest und die
du dann vorher oder nach der auswertung leerst.

mit einer subquery wäre das leider kein problem ab das geht ja lt. dir
in mysql leider nicht

noch ne möglichkeit wäre auch die datenstruktur neu zu überlegen

ciao und baba

christian

create view MAXDATUM
as
select tab1.id, max(nvl(tab2.abdatum,‚01-JAN-1900‘)) datum
from tab1, tab2
where tab1.id = tab2.id (+)
group by tab1.id;

create view ALLES
as
select tab1.id id, tab1.geburtsname geburtsname,
nvl(tab2.neuname, tab1.geburtsname) name,
max(nvl(tab2.abdatum,‚01-JAN-1900‘)) datum
from tab1, tab2
where tab1.id = tab2.id (+)
group by tab1.id, tab1.geburtsname, nvl(tab2.neuname,tab1.geburtsname);

SQL> select * from maxdatum;

ID DATUM


1 01-JUN-02
2 01-JAN-00

SQL> select * from alles;

ID GEBURTSNAM NAME DATUM


1 Mueller Meier 01-JUN-02
1 Mueller Mueller 01-JAN-02
2 Schmid Schmid 01-JAN-00

SQL> r
1 select alles.id, alles.name
2 from alles, maxdatum
3 where alles.id = maxdatum.id
4* and alles.datum = maxdatum.datum

ID NAME


1 Meier
2 Schmid

Hi,

Tab1:
ID geburtsname
1 Müller
2 Schmid

Tab2:
ID famst neuname abDatum
1 heira 01.01.2002
1 heira Meier 01.06.2002

also Fr. Müller hat am 1.1. geheiratet, aber trägt erst seit
dem 1.6. den Namen ihres Mannes…
Ich brauch jetzt ein sql-Statement, das mir eine simple Liste
aus ID und aktuellem Namen erzeugt, natürlich jeweils nur ein
Eintrag

SELECT Distinct Tab1.id, Tab1.geburtsname, Tab2.neuname FROM
Tab1, Tab2 where Tab1.id = Tab2.id

Noch eine Anregung: meistens ist eine Tabellenstruktur, aus der sich die Daten nur unter Verrenkungen herausholen lassen, nicht zweckdienlich. Überlege, ob für die geforderte Auswertung nicht doch ein anderes Datenmodell erforderlich ist.

Konkret fällt mir kein Anwendungsfall ein, bei dem ich Deine Tab1 verwenden würde. Noch konkreter, wenn es tatsächlich um Namen und Heirat ginge. Oder war das nur ein Beispiel?

Gruß

J.

Hai, Christian,

kannst du in mysql einen view erstellen?

Nee, kann er nich’ - die „empfehlen“ das Arbeiten mit temporären Dateien :frowning:
Ich hatte gehofft, ich könne mir das verkneifen… ach, seufs

Danke für Tip und Mühe

Gruß
Sibylle

Hai, José,

Noch eine Anregung: meistens ist eine Tabellenstruktur, aus
der sich die Daten nur unter Verrenkungen herausholen lassen,
nicht zweckdienlich. Überlege, ob für die geforderte
Auswertung nicht doch ein anderes Datenmodell erforderlich
ist.

Konkret fällt mir kein Anwendungsfall ein, bei dem ich Deine
Tab1 verwenden würde. Noch konkreter, wenn es tatsächlich um
Namen und Heirat ginge. Oder war das nur ein Beispiel?

Das ist ein Teil einer zukünftigen Personaldatenbank (die ihrerseits nur ein Modul eines größeren Projektes wird).
In Tab1 landen alle unveränderlichen Daten, also auch Geburtsdatum, Sozialversicherungsnummer, Ersteinstellungsdatum, Personalnummer…
Und die Tab2 hatte ich für alle Namensänderungen vorgesehen, also Heirat, Titel-Erhalt, Geschlechtsumwandlungen mit Vornamensänderung (lach nicht - so einen Fall gibt’s in der Firma…).
Ich hielt daher diese Teilung für besonders schlau :wink: von mir - zumal eine der Anforderungen der Firma eine „Historie“ der Mitarbeiter ist, in der z.B. alle Namensänderungen aufgelistet sind (die haben da eine Mitarbeiterin, die inzwischen das 275. mal verheiratet ist und immer den Namen des Mannes angenommen hat, also in der Firma mit 1856 Namen auftaucht…)
Hast Du 'ne bessere Idee, wie man sowas aufteilt, ohne die db mit leeren Datenfeldern zuzumüllen?

Danke
Gruß
Sibylle

Hai, José,

Wohl eher Wal :smile:

Das ist ein Teil einer zukünftigen Personaldatenbank (die
ihrerseits nur ein Modul eines größeren Projektes wird).
In Tab1 landen alle unveränderlichen Daten, also auch
Geburtsdatum, Sozialversicherungsnummer,
Ersteinstellungsdatum, Personalnummer…
Und die Tab2 hatte ich für alle Namensänderungen vorgesehen,
also Heirat, Titel-Erhalt, Geschlechtsumwandlungen mit
Vornamensänderung (lach nicht - so einen Fall gibt’s in der
Firma…).

[schnipp]

Hast Du 'ne bessere Idee, wie man sowas aufteilt, ohne die db
mit leeren Datenfeldern zuzumüllen?

Also da sollte man doch versuchen, die unterschiedlichen Anwendungsfälle zu unterscheiden. Zum einen brauchst Du für eine Personendatenbank alle aktuellen Daten, d.h. Du willst Deine Mitarbeiter anschreiben, usw. Die Historie ist eine andere Geschichte, die mußt Du nicht unbedingt zusammen verwalten.
Ich würde eine Stammdatentabelle anlegen, die ganz klassisch mit den Feldern Name, Vorname, Geburtsname, usw. auskommt und nur den letzten gültigen Wert beinhaltet. Zusätzlich noch eine Historientabelle, die nur die Änderungen enthält.
Wenn man es genau machen will, dann könnte man eine feldbezogene Historie einfügen: jeder Historiensatz enthält ein Datum, den Feldnamen, den alten Wert und den neuen Wert. Das ist aber für eine Personaldatenbank m.E. nicht notwendig, es würde wahrscheinlich reichen, wenn man z.B. das Datum und ein Klartextfeld einführt, in dem die Software halbautomatisch Werte einträgt (z.B. „Name durch Heirat von Müller zu Meier geändert“). Diese Historie könnte man in einer gesonderten Maske darstellen.

Gruß

J.

1 Like

Wohl eher Wal :smile:

nagut - Makrele, José, :wink:

Ich würde eine Stammdatentabelle anlegen, die ganz klassisch
mit den Feldern Name, Vorname, Geburtsname, usw. auskommt und
nur den letzten gültigen Wert beinhaltet. Zusätzlich noch eine
Historientabelle, die nur die Änderungen enthält.

Hmmm - dann müsste ich die Werte in der Stammdatentabelle bei jeder Ändrung entsprechend anpassen und die Altdaten auslagern und dann…
Gar nicht mal sooo blöd, die Idee… :wink:

Diese Historie könnte man in einer gesonderten
Maske darstellen.

Na, sowieso

Danke für den Tip - manchmal bin ich so tief in einem Projekt, daß ich ganz vernagelt bin und mir partout keine einfachen Lösungen mehr einfallen…

Gruß
Sibylle