Ich habe die folgende Frage:
%Vor%Ich bekomme die folgende Nachricht: 'Outer Join Operator (+) nicht erlaubt in Operand von OR oder IN'. Ich weiß über die Verwendung von 2 Unions mit inneren Joins ist eine Lösung, aber ich kann es nicht verwenden, weil ich tatsächlich viel Code habe (Code, den ich zur Verfügung gestellt habe, ist nur ein Beispiel).
Edit: Ich brauche das über die Oracle-Syntax, weil ich mit Data Warehousing arbeite und unser ETL die explizite Syntax nicht vollständig unterstützt. Vielleicht gibt es etwas, was ich nicht sehe und das kann anders geschrieben werden?
Edit nr.2: Vielleicht kann eine datumsüberlappende Logik irgendwie implementiert werden, ohne OR zu verwenden und mit Oracle-Syntax?
Da Sie die Outer-Join-Syntax im alten Stil verwenden müssen, gibt es hier eine Möglichkeit (vereinfacht, da Sie uns keine Beispieldaten und / oder Tabellenerstellungsskripts zur Verfügung gestellt haben):
%Vor%Sind Sie sicher, dass Sie Ihr Äußeres richtig herum geführt haben? Sind Sie sicher, dass Sie nicht wirklich hinter dem folgenden stehen?:
%Vor% Verwenden Sie explizite left join
Syntax:
Eine einfache Regel ist, niemals ein Komma in der from
-Klausel zu verwenden. Verwenden Sie immer explizite join
Syntax.
Hinweis: Technisch gesehen würde Ihre äußere Joinsyntax die Tabellen in der anderen Reihenfolge haben:
%Vor% Ich habe sie absichtlich getauscht. Die left join
behält alle Zeilen in der ersten Tabelle, auch diejenigen ohne Übereinstimmungen. Die +
-Syntax ist schwieriger zu folgen. Die +
geht auf die Seite, die die NULL
-Werte erhalten würde. Für mich scheint dies jedoch weniger wahrscheinlich zu sein, dass die nicht übereinstimmenden Zeilen in der Zuordnungstabelle enthalten sind.
Wenn Sie richtige Fremdschlüsselbeziehungen haben, sollten alle Zuweisungen eine korrekte Person haben. Ich verstehe jedoch Ihre Daten nicht, und Sie möchten vielleicht Ihre Tabellen für das, was Sie wirklich tun wollen, umkehren.
BEARBEITEN:
Wie für Überschneidungen würde ich geneigt sein, das einfachere zu verwenden:
%Vor% Sie können dies sogar mit der archaischen Schreibweise +
schreiben, wenn Sie möchten. Beachten Sie auch: Diese tun nicht genau die gleichen Dinge. Dadurch werden Überlappungen erkannt, bei denen eine Periode vollständig in eine andere Periode eingebettet ist.
Bitte verwenden Sie dies nur, wenn Sie ANSI LEFT OUTER JOIN Syntax nicht verwenden können:
Erstens: In Ihrer Anfrage fehlen Klammern - neben dem ursprünglichen JOIN können Sie x between min(+) AND max(+)
als (min is NULL OR x >= min) AND (max is NULL OR x <= max)
Ich denke, das wählt aus, was Sie wollen - ein linker Join mit allen Zeilen, wobei start_date oder end_date zwischen den beiden Daten liegt.
Sie möchten alle Zeilen, die entweder aus einem LINKEN JOIN mit ID und einem rechten Anfangsdatum OR stammen, mit nur dem Enddatum, ohne dass eine ID dazugehört ... Ihre Abfrage war im Wesentlichen folgende: WHERE ( id1=id2(+) AND ...) OR ( ... )
wegen AND ist stärker bindend als OR.
emp.date_from
und emp.date_to
beide gültig oder NULL Wenn es also nie einen Fall gibt, in dem nur date_from NULL ist, aber date_to gültig ist, können Sie die Anweisung erheblich verkürzen:
%Vor%