Zum Forum springen
Benachrichtigungen
Alles löschen

Probleme bei SQL Abfrage

4 Beiträge
3 Benutzer
0 Reactions
667 Ansichten
schmissi
Beigetreten: 28.02.2007
PokerStrategist

Hallo,

ich hab folgendes Problem beim erstellen einer wie ich denke nicht allzu komplizierten Abfrage:

Ausgangstabellen:

Erklärungen:

md_runs: run_pk ist eindeutig, eine sys_pk hat mehrer run_pk, jeder run_pk ist ein run_date zugeordnet

dl_config: table_name ist nicht eindeutig, jeder table_name besitzt mehrere run_pk

table_size: ordnet einer sys_pk ein table_name zu, eine sys_pk kann mehrere table_name haben

Gewünschtes Vorgehen:

Am Ende würde ich gerne folgende Tabelle erahlten:

Diese erhalte ich dadurch, dass ich die table_size Tabelle zeile für zeile durchgehe und zuerst nach dem table_name in der dl_config tabelle suche.

Alle run_pk die ich dort mit der entsprechenden Tabelle finde überprüfe ich anhand der md_runs tabelle ob sie der gewünschten sys_pk zugeordnet sind, und wenn ja übernehmen ich das run_date mit der höchsten run_pk in die tabelle table_updates.

Habe bereits eine Abfrage geschrieben, in die ich die sys_pk und den table_name von Hand eingeben kann und mir dann die entsprechende run_pk (und damit auch das run_date) ausgegeben wird.

select max(run_date) from md_runs where sys_pk = 'gewünschte sys_pk'

and run_pk in

(select run_pk from dl_config where table_name = 'gewünschten table_name')

Leider nützt mir das wenig, da ich nicht jede sys_pk/table_name Kombination von Hand eingeben will. Eine Schleife um diese Anweisung ist auch keine Lösung, da das dann mit den realen Tabellen zu lange dauert.

Würde das ganze gerne irgendwie über einen join oder so realisieren.

Kann mir da wer helfen?

Vielen Dank schonmal :)


Antwort
Zitat
3 Antworten
noelte
Beigetreten: 13.05.2007
Elite Grinder

u.U. geht es auch ohne union.... problem ist, dass wir eigentlich ein left outer join brauchen, wegen der nicht besetzten kombies und da muß auch noch das max selectiert werden.... kein Plan => also in zwei Schritten.
1. selectiere alle besetzten kombies und
2. vereinige mit den nicht besetzten....

natürlich nicht getestet...

select t.table_name,t.sys_pk,(select max(md.run_date) from dl_config as dl,md_runs as md where dl.run_pk=md.run_pk and dl.table_name=t.table_name and md_sys_pk=t.sys_pk) from table_size as t
union
select t.table_name,t.sys_pk,null from table_size as t where not exists (select * from dl_config as dl,md_runs as md where dl.run_pk=md.run_pk and dl.table_name=t.table_name and md_sys_pk=t.sys_pk)


Antwort
Zitat
pure
Beigetreten: 28.02.2006
Elite Grinder

versteh die tabellen (-abhängigkeiten) nicht ganz, aber basierend auf

Original von schmissi
Diese erhalte ich dadurch, dass ich die table_size Tabelle zeile für zeile durchgehe und zuerst nach dem table_name in der dl_config tabelle suche.

Alle run_pk die ich dort mit der entsprechenden Tabelle finde überprüfe ich anhand der md_runs tabelle ob sie der gewünschten sys_pk zugeordnet sind, und wenn ja übernehmen ich das run_date mit der höchsten run_pk in die tabelle table_updates.

könnte folgendes klappen:
select
t.table_name,
t.sys_pk,
max(m.run_date)
from table_size t
left join dl_config d using (table_name)
left join md_runs d on d.run_pk=m.run_pk and t.sys_pk=m.sys_pk
group by 1,2

das geht allerdings davon aus dass das grösste run_pk auch immer das grösste run_date hat, zudem ist die t.sys_pk=m.sys_pk-bedingung drin, die in deiner abfrage fehlt aber laut obiger beschreibung erforderlich ist.
vielleicht hilft's ja.


Antwort
Zitat
schmissi Themenstarter
schmissi
Beigetreten: 28.02.2007
PokerStrategist

nochmal kurz zur erklärung der bedeutungen und zusammenhänger der tabellen.

es gibt verschiedenen systeme, welche durch ihre sys_pk eindeutig identifiziert werden.
Ein System besitzt mehrere Tabellen. Aus der table_size Tabelle kann herausgelesen werden welches system welche tabellen besitzt.

Bekommt ein system ein update, erfolgt ein eintrag in md_runs. Ebenso erfolgt ein Eintrag in dl_config für die tabellen des geupdateten systems. Hierbei muss es aber nicht zwangsläufig sein, dass alle Tabellen des geupdateten systems ebenfall ein update bekommen. Wenn sie ein update bekommen, wird eine neue zeile erstellt mit dem entsprechenden table_name und der run_pk des zugehörigen systems.

Weiterhin ist zu beachten, dass die gleiche Tabelle in mehreren Systemen vorkommen kann.
Beispiel:
system 1 wird geupdatet -> Eintrag mit sys_pk =1 und neuer run_pk in md_runs -> Eintrag
der geupdateten tabellen in dl_config mit gleicher run_pk wie in Schritt zwei

hoffe dass es jetzt bisschen klarer geworden ist


Antwort
Zitat
Teilen: