Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#14

AW: Firebird - where Bedingung mit Bedingung

  Alt 4. Sep 2024, 13:59
Nimm bitte mal nur die zweite Hälfte des Union und schau, ob sich hierdurch was verbessert / verändert:
SQL-Code:
select T1.ID as T1_ID,
       T3.T2_ID,
       T3.WERT
from
(
  select ID from TABELLE1 where not "GLOBAL"
) T1
inner join TABELLE3 T3 on T3.T1_ID = T1.ID
In der ersten Hälfte des Union lässt sich bestimmt auch noch was optimieren, weiß aber gerade keinen sinnvollen Ansatz dazu.
SQL-Code:
select T1.ID as T1_ID,
       T2.ID as T2_ID,
       T3.WERT
from TABELLE1 T1
cross join TABELLE2 T2
inner join TABELLE3 T3 on T3.T1_ID = T1.ID and
                T1."GLOBAL" and
            T3.T2_ID = ( select T2_TEMP.ID -- sowas ist nicht unbedingt performant
                      from TABELLE2 T2_TEMP
                             where T2_TEMP.MAIN)
Leider ist es nicht unbedingt einfach die SQL-Syntax zu prüfen, wenn man keine entsprechenden Tabellen und Daten hat, daher ein Versuch für die erste Hälfte des Union als Idee, ohne Anspruch auf korrekte Syntax:
SQL-Code:
select T1.ID as T1_ID,
       T2.ID as T2_ID,
       T3.WERT
from
(
  select ID from TABELLE1 where "GLOBAL"
) T1
cross join TABELLE2 T2
inner join TABELLE3 T3 on T3.T1_ID = T1.ID
inner join (select ID from TABELLE2 where MAIN) T4 on T3.T2_ID = T4.ID
Wenn das funktionieren sollte, ergäbe sich daraus folgendes SQL:
SQL-Code:
select T1.ID as T1_ID,
       T2.ID as T2_ID,
       T3.WERT
from
(
  select ID from TABELLE1 where "GLOBAL"
) T1
cross join TABELLE2 T2
inner join TABELLE3 T3 on T3.T1_ID = T1.ID
inner join (select ID from TABELLE2 where MAIN) T4 on T3.T2_ID = T4.ID
union
select T1.ID as T1_ID,
       T3.T2_ID,
       T3.WERT
from
(
  select ID from TABELLE1 where not "GLOBAL"
) T1
inner join TABELLE3 T3 on T3.T1_ID = T1.ID
Kann es passieren, dass Datensätze sowohl in der ersten Hälfte des Union selektiert werden, als auch in der zweiten Hälfte des Union? Wenn nein, ändere das Union bitte in Union All. Dadurch muss die Datenbank das Ergebnis nicht sortieren und von Dubletten bereinigen, was die Abfrage (je nach Datenmenge) durchaus deutlich beschleunigen kann.
  Mit Zitat antworten Zitat