Hallo zusammen,
ich bin mir grad nicht sicher ob mein Ansatz der richtige ist oder ob es vielleicht besser zu lösen geht (performanter)
Ausgangssituation (Beispieldaten)
Tabelle A - Personen - (Vorname, Name etc. + ID's für Wohnort und Bundesland)
Tabelle B - Meldungen - (Nachrichten der Personen - also eine Tabelle mit N:1 Beziehung zu Tabelle A)
Tabelle C - Historie - (Vorgänge zu den Personen - also auch eine Tabelle mit N:1 Beziehung zu Tabelle A)
Die Anzahl der Datensätze ist ca. so verteilt: A / B / C -> 1000 / 1.000.000 / 2.500.000
Ziel ist es jetzt zu allen Personen in einem bestimmten Bundesland (1) aus Tabelle B zwei bestimmten Meldung abzufragen und aus Tabelle C diverse Vorgänge (Vorgang A - x mal, Vorgang B - x mal, Vorgang C - x mal) zu zählen
Ich würde jetzt folgenden Ansatz wählen:
select person from a where bundesland = 1
Da ich 2 Felder aus Tabelle B und 3 aus Tabelle C brauch und die Tabellen in N:1 Beziehung stehen komm ich hier mit Left Join nicht weiter richtig?
Ich würde demnach die Abfragen in Sub Selects packen was aber in meinen Augen nicht performant ist da er ja für jede Personen ID immer über die kompletten Tabellen B und C rattern muss. Zumal die Daten von C ja jedesmal gruppiert werden müssen zum zählen.
select a.person
, (select b.meldung from B where a.id = b.id and meldung like "YYY") as meldung1
, (select b.meldung from B where a.id = b.id and meldung like "XXX") as meldung2
, (select count(c.id) from C where a.id = c.id and c.vorgang = '1' group by c.id) as anz_vorgang1
, (select count(c.id) from C where a.id = c.id and c.vorgang = '2' group by c.id) as anz_vorgang2
, (select count(c.id) from C where a.id = c.id and c.vorgang = '3' group by c.id) as anz_vorgang3
from a where bundesland = 1
Oder doch mit Left join auf C mit group by c.id um dann mit einer SUM IF Abfrage die Vorgänge zu zählen?
select a.person
, (select b.meldung from B where a.id = b.id and meldung like "YYY") as meldung1
, (select b.meldung from B where a.id = b.id and meldung like "XXX") as meldung2
, SUM (if c.vorgang = 1, 1, 0) as anz_vorgang1
, SUM (if c.vorgang = 2, 1, 0) as anz_vorgang2
, SUM (if c.vorgang = 3, 1, 0) as anz_vorgang3
from a
left join C on a.id = c.id
where bundesland = 1
group by C.id
Kann man hier die 2 Sub Selects noch anders (besser) auflösen=? Oder habt ihr gar ganz andere Vorschläge wie das besser zu handhaben ist ?
Danke für Eure Tipps und Hinweise.
PS: Das ist nur Beispiel Code und ist nicht getestet.
ich bin mir grad nicht sicher ob mein Ansatz der richtige ist oder ob es vielleicht besser zu lösen geht (performanter)
Ausgangssituation (Beispieldaten)
Tabelle A - Personen - (Vorname, Name etc. + ID's für Wohnort und Bundesland)
Tabelle B - Meldungen - (Nachrichten der Personen - also eine Tabelle mit N:1 Beziehung zu Tabelle A)
Tabelle C - Historie - (Vorgänge zu den Personen - also auch eine Tabelle mit N:1 Beziehung zu Tabelle A)
Die Anzahl der Datensätze ist ca. so verteilt: A / B / C -> 1000 / 1.000.000 / 2.500.000
Ziel ist es jetzt zu allen Personen in einem bestimmten Bundesland (1) aus Tabelle B zwei bestimmten Meldung abzufragen und aus Tabelle C diverse Vorgänge (Vorgang A - x mal, Vorgang B - x mal, Vorgang C - x mal) zu zählen
Ich würde jetzt folgenden Ansatz wählen:
select person from a where bundesland = 1
Da ich 2 Felder aus Tabelle B und 3 aus Tabelle C brauch und die Tabellen in N:1 Beziehung stehen komm ich hier mit Left Join nicht weiter richtig?
Ich würde demnach die Abfragen in Sub Selects packen was aber in meinen Augen nicht performant ist da er ja für jede Personen ID immer über die kompletten Tabellen B und C rattern muss. Zumal die Daten von C ja jedesmal gruppiert werden müssen zum zählen.
select a.person
, (select b.meldung from B where a.id = b.id and meldung like "YYY") as meldung1
, (select b.meldung from B where a.id = b.id and meldung like "XXX") as meldung2
, (select count(c.id) from C where a.id = c.id and c.vorgang = '1' group by c.id) as anz_vorgang1
, (select count(c.id) from C where a.id = c.id and c.vorgang = '2' group by c.id) as anz_vorgang2
, (select count(c.id) from C where a.id = c.id and c.vorgang = '3' group by c.id) as anz_vorgang3
from a where bundesland = 1
Oder doch mit Left join auf C mit group by c.id um dann mit einer SUM IF Abfrage die Vorgänge zu zählen?
select a.person
, (select b.meldung from B where a.id = b.id and meldung like "YYY") as meldung1
, (select b.meldung from B where a.id = b.id and meldung like "XXX") as meldung2
, SUM (if c.vorgang = 1, 1, 0) as anz_vorgang1
, SUM (if c.vorgang = 2, 1, 0) as anz_vorgang2
, SUM (if c.vorgang = 3, 1, 0) as anz_vorgang3
from a
left join C on a.id = c.id
where bundesland = 1
group by C.id
Kann man hier die 2 Sub Selects noch anders (besser) auflösen=? Oder habt ihr gar ganz andere Vorschläge wie das besser zu handhaben ist ?
Danke für Eure Tipps und Hinweise.
PS: Das ist nur Beispiel Code und ist nicht getestet.