AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Select mit Summe über Tabellen mit Join
Thema durchsuchen
Ansicht
Themen-Optionen

Select mit Summe über Tabellen mit Join

Ein Thema von Dumpfbacke · begonnen am 24. Feb 2020 · letzter Beitrag vom 1. Mär 2020
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von IBExpert
IBExpert
Online

Registriert seit: 15. Mär 2005
671 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Select mit Summe über Tabellen mit Join

  Alt 24. Feb 2020, 20:25
Select
t1.Lagerplatz,
(select sum(t2.Preis) from tabelle2 t2 where t2.IDSchrank = t1.ID) as Preis
from
Tabelle1 t1
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung

Geändert von IBExpert (24. Feb 2020 um 20:32 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#12

AW: Select mit Summe über Tabellen mit Join

  Alt 24. Feb 2020, 22:44
@jobo
SO hatte ich auch mal angefangen. Das geht leider nicht. Es kommen hier nicht die Leere Lagerplätze mit raus.
Interessant! Wenn das von Frickler geht, sollte meins oder das von mkinzler auch klappen. Vielleicht hast Du dieses Beispiel(?) zu sehr vereinfacht und bei der Übernahme in Dein System etwas übersehen?
Ein klassisches Problem bei Outer Joins ist das Ergänzen von Kriterien im WHERE auf der Outer Seite. Damit zerstört man den Outer Charakter des Joins und erhält das Ergebnis eines Full Joins (also keine Leerwerte).

Vielleicht ist ja das Statement von IBExpert schneller. Das hängt aber durchaus mit Indizierung und Mengenverhältnissen der Tabellen zusammen. Wenn Du mehr verrätst, kann man das sicher eher prognostizieren.

Vielleicht hilft auch die Ausgabe des Query Plans beim Tuning.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 08:14
Ich würde mal etwas anderes vorschlagen

Man macht erstmal ein SQL, welches davon ausgeht, dass in keinem Lagerplatz etwas ist

Code:
SELECT 0 AS Total, Zähler AS Id FROM Tabelle1
Dazu ein SQL, welches zählt, was alles da ist

Code:
SELECT SUM(Preis) AS Total, IdSchrank AS Id FROM Tabelle2 GROUP BY IdSchrank
Diese beiden SQLs mit einem UNION zusammenführen und davon dann ein SUM bilden und dann noch den Lagerplatznamen holen über ein JOIN

Code:
SELECT SUM(A.Total) AS Total, A.Id, C.Lagerplatz
FROM ( 
      SELECT 0 AS Total, Zähler AS Id FROM Tabelle1
      UNION
      SELECT SUM(Preis) AS Total, IdSchrank AS Id FROM Tabelle2 GROUP BY IdSchrank
     ) A
LEFT JOIN Tabelle1 C ON (A.Id=C.id)
GROUP BY A.Id, C.Lagerplatz
Viel Spass
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 08:37
Gute Idee. Eine ähnliche Möglichkeit wäre:

SQL-Code:
SELECT max(A.Total) AS Total, A.Id, C.Lagerplatz
FROM (
      SELECT 0 AS Total, Zähler AS Id FROM Tabelle1
      UNION
      SELECT SUM(Preis) AS Total, IdSchrank AS Id FROM Tabelle2 GROUP BY IdSchrank
     ) A
LEFT JOIN Tabelle1 C ON (A.Id=C.id)
GROUP BY A.Id, C.Lagerplatz
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
589 Beiträge
 
Delphi XE6 Enterprise
 
#15

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 09:27
Select
t1.Lagerplatz,
(select sum(t2.Preis) from tabelle2 t2 where t2.IDSchrank = t1.ID) as Preis
from
Tabelle1 t1
Bingo! Auch ohne Index die schnellste Lösung (wenn man die Statistik betrachtet).

...und meine war die langsamste

(aber alle funktionieren)

@SinSpin: "IsNull", "IfNull" und "Coalesce" hat jeweils die gleiche Funktion. "Coalesce" ist aber SQL-Standard, die anderen beiden sind herstellerspezifisch.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 09:42
Select
t1.Lagerplatz,
(select sum(t2.Preis) from tabelle2 t2 where t2.IDSchrank = t1.ID) as Preis
from
Tabelle1 t1
Bingo! Auch ohne Index die schnellste Lösung
Also IBExpert ist natürlich Experte, aber so pauschal wäre ich da vorsichtig.
Es kommt m.E. sehr auf das Mengenverhältnis von T1 zu T2 an. Je nach absoluten Zahlen dürfte auch ein Index einen großen Unterschied machen.
Man kann vielleicht aus Anwendungssicht hier sagen, ok, soviel Schränke hat kein Mensch, erst Recht nicht so viel Kleber. Also alles relativ...


P.S.: das eigentlich Interessante ist doch, dass bei Tanja nur die Variante von Frickler läuft.
Gruß, Jo

Geändert von jobo (25. Feb 2020 um 09:45 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
589 Beiträge
 
Delphi XE6 Enterprise
 
#17

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 10:19
Also IBExpert ist natürlich Experte, aber so pauschal wäre ich da vorsichtig.
Es kommt m.E. sehr auf das Mengenverhältnis von T1 zu T2 an. Je nach absoluten Zahlen dürfte auch ein Index einen großen Unterschied machen.
Man kann vielleicht aus Anwendungssicht hier sagen, ok, soviel Schränke hat kein Mensch, erst Recht nicht so viel Kleber. Also alles relativ...

P.S.: das eigentlich Interessante ist doch, dass bei Tanja nur die Variante von Frickler läuft.
Ich hatte einfach die beiden Tabellen nachgebaut und direkt getestet. Vermutlich sehen die "eigentlichen Tabellen" ganz anders aus...

P.S.: laut FB-Forum wird eine CTE intern wie eine derived table ausgeführt. Ich hab das dann mal umgestellt:
Code:
select t1.lagerplatz, s.summe
from tabelle1 t1
left join (select idschrank, sum(preis) as summe
           from tabelle2
           group by idschrank) s
on t1.ZAEHLER = s.idschrank
...und auch das ist viel schneller als die CTE.
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert
Online

Registriert seit: 15. Mär 2005
671 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Select mit Summe über Tabellen mit Join

  Alt 25. Feb 2020, 16:54
Es kommt m.E. sehr auf das Mengenverhältnis von T1 zu T2 an.
das stimmt, udn es ist auch wichtig darauf zu achten, aber das es in der detailtabelle einen index zum master geben sollte, müsste jedem klar sein und mit einem FK hättest du den bei Firebird automatisch. Das schöne an so einem Verfahren ist, das du relativ genau weisst, wieviele operationen es gibt, nämlich eine für die gesamtdatenmenge (also der Schränke), die du dann aber beliebig einschränken kannst, durch weitere where Bedingungen usw., und dann für jeden dort noch vorhanden Datensatz wird der Subselect aufgerufen. Das kann je nach datenmenge langsam oder eben sauschnell sein, aber nie wirklich langsam, weil der optimierer sich da vielelicht im kreis dreht
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

AW: Select mit Summe über Tabellen mit Join

  Alt 29. Feb 2020, 09:06
Danke an alle die mir hier geholfen haben. Das Problem ist nun beseitigt worden. Der Secet von @IBExpert macht genau das was er soll und das ganze auch noch super, super schnell.

Ach so falles es jemand hier interesier. Die Mengen von T1 sind kein und die Mengen von T2 sind groß.

Tanjs
Tanja
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#20

AW: Select mit Summe über Tabellen mit Join

  Alt 1. Mär 2020, 13:42
Die Mengen von T1 sind kein und die Mengen von T2 sind groß.
Danke für das Feedback, das ergibt ein stimmiges Bild.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz