Mam połączenie na dwóch tabelach zdefiniowane jako lewe sprzężenie zewnętrzne, tak że wszystkie rekordy są zwracane z tabeli po lewej stronie, nawet jeśli nie mają rekordu w prawej tabeli. Jednak muszę również umieścić klauzulę where na polu z prawej strony, ale ... Nadal chcę, aby rząd z lewego stołu był zwracany dla każdego rekordu w tabeli po lewej stronie, nawet jeśli warunek w klauzuli where nie jest spełniony. Czy jest sposób na zrobienie tego?Lewe połączenie zewnętrzne i dodatkowe, gdzie klauzula
Odpowiedz
Tak, postawić warunek (zwany predykatem) w warunkach przyłączenia
Select [stuff]
From TableA a
Left Join TableB b
On b.Pk = a.Pk
-- [Put your condition here, like this]
And b.Column = somevalue
Wystarczy umieścić predykat pod warunkiem JOIN
. Umieszczenie go w klauzuli WHERE
skutecznie przekształciłoby zapytanie w wewnętrzne sprzężenie.
Dla przykładu:
...
From a
Left Join b on a.id = b.id and b.condition = 'x'
SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc
select *
from table1 t1
left outer join table2 t2 on t1.id = t2.id
where t1.some_field = nvl(t2.some_field, t1.some_field)
UPD: eeee ... nie. w ten sposób:
select *
from table1 t1
left outer join table2 t2 on t1.id = t2.id
where some_required_value = nvl(t2.some_field, some_required_value)
nvl
jest składnia Oracle który zastępuje pierwszy argument z sekundę w przypadku jest null
(co jest wspólne dla sprzężenia zewnętrzne). Możesz użyć ifnull
lub coalesce
dla innych baz danych.
Tak więc, jeśli porównać t2.some_field
z podanych kryteriów, jeśli spełnił dołączyć orzeczenie, ale jeżeli nie ma, to po prostu powrót wiersz z table1
, ponieważ some_required_value
porównaniu będzie się zawsze być prawdą (chyba że jest null
jednak - null = null
plony null
, ani true
nie false
można używać
WHERE (right_table.column=value OR right_table.column IS NULL)
To zwróci wszystkie wiersze z tabeli 1 i tabeli 2, ale tylko trakt. re tabela 1 nie ma odpowiedniego wiersza w tabeli 2 lub odpowiedni wiersz w tabeli 2 odpowiada twoim kryteriom.
To nie działa na ECC6 –