Zapytanie z lewym złączeniem nie zwraca rekordów, chociaż klauzula where z lewej tabeli powinna znaleźć pojedynczy rekord. W takim przypadku powinien zwrócić rekord z polami z lewej tabeli zawierającymi wartości oraz z prawej tabeli null, ponieważ nie ma między nimi żadnego dopasowania.Lewe wyrażenie złączenia i liczba wierszy zwróconych przez Oracle
Najwyraźniej występuje problem z użyciem przypadku, który odwołuje się do prawej tabeli w wyrażeniu sprzężenia.
W SQL Server to samo zapytanie działało zgodnie z oczekiwaniami.
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
Wynik: nie zwrócono wierszy.
Następnie przeniosłem wyrażenie t2.Id = t2.Id
(które jest tutaj tylko po to, aby zademonstrować problem i powinno zawsze zwracać wartość true, najwyraźniej) z wyrażenia case.
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
Wynik: zwrócił jeden wiersz.
Powyższe zapytania służą jedynie do wykazania problemu, nie są przydatne w rzeczywistej sytuacji i nie są zoptymalizowane.
Chcę wiedzieć, czy ktokolwiek wie jakiekolwiek ograniczenia Oracle związane z tą sprawą. Do tej pory uważamy, że jest to błąd.
Dane wykorzystywane:
- A: Dichlorowodorek 1 Opis Przedmiot = A1;
- B: Id = 1, Opis = Pozycja B1;
- C: Id = 1, Id_B = 2, Flaga = S.
Nie nazwałbym tego błędem, ja nazywam to inną implementacją. SQL Server i ORacle nie są klonami. Szczerze mówiąc, osobiście martwiłbym się bardziej o mój własny projekt bazy danych, jeśli czujesz potrzebę umieszczenia każdego rodzaju oświadczenia w akcie. – HLGEM
Aby jeszcze raz sprawdzić, jak rozumiem problem, spodziewano się, że pierwsze zapytanie zwróci jeden wiersz? –
Oto tabela testowa i zapytanie dotyczące problemu dla każdego, kto na to patrzy. Uruchom zapytanie, a następnie wyświetl plan wykonania. http://sqlfiddle.com/#!4/449ba/4 –