Eine Abfrage mit linkem Join gibt keine Datensätze zurück, obwohl die where-Klausel aus der linken Tabelle einen einzelnen Datensatz finden sollte. In diesem Fall sollte ein Datensatz mit den Feldern aus der linken Tabelle mit Werten und aus der rechten Tabelle mit null zurückgegeben werden, da keine Übereinstimmung zwischen ihnen besteht.Linker Join-Ausdruck und Anzahl der von Oracle zurückgegebenen Zeilen
Anscheinend gibt es ein Problem mit der Verwendung von case, die auf die richtige Tabelle auf dem Join-Ausdruck verweist.
In SQL Server funktionierte die gleiche Abfrage wie erwartet.
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
1 = case when (
t2.Id = t2.Id and
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S'
) then 1 else 0
end
where t1.Id = 1
Ergebnis: keine Zeilen zurückgegeben.
Dann habe ich den Ausdruck t2.Id = t2.Id
(das ist hier nur, um das Problem zu demonstrieren und sollte immer wahr, scheinbar) aus dem Fall Ausdruck verschoben.
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
t2.Id = t2.Id and
1 = case when (
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S') then 1 else 0
end
where t1.Id = 1
Ergebnis: eine Zeile zurückgegeben.
Die obigen Abfragen dienen nur zur Demonstration des Problems, sind in einer realen Situation nicht sinnvoll und nicht optimiert.
Ich möchte wissen, ob irgendjemand eine Einschränkung von Oracle in Bezug auf diesen Fall kennt. Bis jetzt glauben wir, dass es ein Fehler ist.
verwendet Daten:
- A: Id = 1, Description = Artikel A1;
- B: Id = 1, Beschreibung = Element B1;
- C: Id = 1, Id_B = 2, Flag = S.
Ich würde es nicht einen Fehler nennen, ich würde es eine andere Implementierung nennen. SQL Server und Oracle sind keine Klone. Und ehrlich gesagt würde ich persönlich mir mehr Sorgen um mein eigenes Datenbankdesign machen, wenn Sie das Bedürfnis verspüren, eine Fallaussage jeglicher Art in einen Join einzufügen. – HLGEM
Um mein Verständnis des Problems zu überprüfen, haben Sie erwartet, dass die erste Abfrage eine Zeile zurückgeben würde? –
Hier sind Testtabelle und die Problemabfrage für jeden, der sich das anschaut. Führen Sie die Abfrage aus, und zeigen Sie den Ausführungsplan an. http://sqlfiddle.com/#!4/449ba/4 –