2013-08-22 27 views

Odpowiedz

15

Jesteś znacznie lepiej wyłączyć za pomocą składni ANSI

SELECT * 
    FROM a 
     LEFT OUTER JOIN b ON(a.id = b.id and 
          b.val = 'test') 

Można zrobić to samo przy użyciu składni Oracle jak dobrze, ale robi się nieco hinkey

SELECT * 
    FROM a, 
     b 
WHERE a.id = b.id(+) 
    AND b.val(+) = 'test' 

Należy pamiętać, że w obu przypadkach ignoruję tabelę c, ponieważ nie określono warunków łączenia. I zakładam, że tak naprawdę nie chcesz dołączyć do A do B, a następnie wygenerować kartezjański produkt z C.

+0

Czy to jest poprawne: WYBIERZ * Z a, b GDZIE a.id = b.id (+) I b.val (+) = 'test' i b.col2 (+) = 'test2'; Chcę uzyskać wszystkie wiersze od a, jeśli odpowiadający wiersz w b jest pusty lub odpowiadający wiersz wb ma kol2 = "test2" i val = "test" Tak więc jest to albo zerowy OR (col2 = "test2" I val = 'test') – Victor

1

Przenieś warunek do klauzuli JOIN i użyj wzorca łączenia ANSI.

SELECT NameYourFields,... 
FROM A 
LEFT OUTER JOIN B 
ON A.ID = B.ID 
AND B.VAL = 'test' 
INNER JOIN C 
ON ... 
0

LEFT OUTER JOIN jest jedną z operacji JOIN, które umożliwiają określenie klauzuli join. Zachowuje niedopasowane wiersze z pierwszego (lewego) stołu, łącząc je z wierszem NULL w kształcie drugiego (prawego) stołu.

więc można zrobić w następujący sposób:

SELECT
Z lewej OUTER JOIN b NA a.id = b.id

--Note że użyłeś podwójny cudzysłów "test", który nie jest używane dla varchar w SQL powinieneś używać pojedynczego cudzysłowu "test"

ORAZ b.val = "test";

1
SELECT * FROM abc a, xyz b 
WHERE a.id = b.id 
    AND b.val = 'test' 
+0

Witam i zapraszam do SO. Dziękuję za Twój wkład, ale byłoby niezmiernie pomocne, gdybyś mógł poszerzyć swoją odpowiedź o kilka szczegółów na temat odpowiedzi na pytanie Victora. – Deepend