So vereinfachen Sie diese SQL -Abfrage
-
03-07-2019 - |
Frage
Die Tabelle - Abfrage hat 2 Spalten (FunktionID, deepFunctionId)
Ich möchte alle Werte, die entweder in FunktionID oder in DeepfunctionID enthalten sind
Ich benutze das:
select distinct depfunctionid from Query
union
select distinct functionid from Query
Wie geht es mir besser?
Lösung
Ich denke, das ist das Beste, was du bekommen wirst.
Andere Tipps
Das ist so gut wie es geht, denke ich ...
Verlieren Sie die unterschiedlichen Klauseln, da Ihre Gewerkschaft (gegen Gewerkschaft alle) sich darum kümmern wird, Duplikate zu entfernen.
Eine Alternative - aber vielleicht weniger klar und wahrscheinlich mit demselben Ausführungsplan - wäre, einen vollständigen Zusammenhang über die beiden Spalten zu machen.
SELECT
COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId
FROM Query as Query1
FULL OUTER JOIN Query as Query2 ON
Query1.FunctionId = Query2.DepFunctionId
Ich bin mir fast sicher, dass Sie die Unterscheidungsmerkmale verlieren können. Wenn Sie Union anstelle von Union alle verwenden, werden doppelte Ergebnisse weggeworfen.
Es hängt alles davon ab, wie schwer Ihre Inline -Ansicht -Abfrage ist. Der Schlüssel für eine bessere Performance wäre, nur einmal auszuführen, aber das ist angesichts der Daten, die sie zurückgibt, nicht möglich.
Wenn Sie es so tun:
select depfunctionid , functionid from Query
group by depfunctionid , functionid
Es ist sehr wahrscheinlich, dass Sie wiederholte Ergebnisse für DeeptunctionID oder FunktionID erhalten.
Ich mag mich irren, aber es scheint mir, dass Sie versuchen, einen Baum von Abhängigkeiten abzurufen. Wenn dies der Fall ist, würde ich persönlich versuchen, einen materialisierten Pfadansatz zu verwenden.
Wenn der materialisierte Pfad in einem selbst -Referenzierungs -Tabellennamen gespeichert wird, würde ich den Baum mit so etwas abrufen
select asrt2.function_id
from a_self_referencig_table asrt1,
a_self_referencig_table asrt2
where asrt1.function_name = 'blah function'
and asrt2.materialized_path like (asrt1.materialized_path || '%')
order by asrt2.materialized_path, asrt2.some_child_node_ordering_column
Dies würde den gesamten Baum in der richtigen Reihenfolge abrufen. Was saugt, ist, den materialisierten Pfad basierend auf der function_id und parent_function_id (oder in Ihrem Fall, FunktionID und DeephunctionID) zu konstruieren, aber ein Auslöser könnte sich leicht darum kümmern.