2010-09-09 10 views
24

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

20

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 
10

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' 
1
SELECT x.fieldA, y.fieldB 
FROM x 
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition) 
ON x.fieldc = y.fieldc 
0
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

2

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.

+0

To nie działa na ECC6 –

Powiązane problemy