Как я могу преобразовать «устаревший» оператор внешнего левого соединения в Oracle? - PullRequest
3 голосов
/ 23 октября 2010

У меня есть две таблицы (A и G) в базе данных Oracle, которые можно объединить на основе номера счета.Единственное предостережение: одна из таблиц (G) имеет примерно на 80 записей меньше, чем другая.Когда я запрашиваю две таблицы вместе, мне нужно получить все строки, чтобы мы увидели данные NULL в столбцах для пропущенных 80 строк.

В настоящее время у меня есть оператор Oracle, который выполняет левое внешнее соединениезапрос с использованием следующего "устаревшего" синтаксиса:

SELECT A.AccountNo,
       A.ParcelNo,
       A.LocalNo,
       A.PrimaryUseCode, 
       A.DefaultTaxDistrict,
       RTRIM(G.Section),
       RTRIM(G.Township),
       RTRIM(g.Range)

  FROM tblAcct A, tblAcctLegalLocation G

 WHERE A.verstart <= '20100917999' AND A.verend > '20100917999' AND A.DefaultTaxDistrict = '2291' 
       AND (SUBSTR(A.AccountNo,1,1) = 'R' or SUBSTR(A.AccountNo,1,1)= 'I') 
       AND SUBSTR(a.ParcelNo,1,1)<> '7' and substr(a.ParcelNo,1,1)<>'8'
       AND A.AcctStatusCode IN ('A', 'T', 'E') 
       AND A.AccountNo = G.AccountNo(+)
       AND G.verstart(+) <= '20100917999' and G.verend(+) > '20100917999'
ORDER BY A.ParcelNo, A.LocalNo

Я пытаюсь преобразовать этот запрос в "стандартный" запрос типа LEFT JOIN, поскольку мне говорят, что более новые версии Oracle поддерживают этот синтаксис.Я попробовал базовый

LEFT OUTER JOIN ON A.AccountNo = G.AccountNo 

, но это не похоже на работу.Мои запросы возвращают на 80 строк меньше полной суммы.

Кто-нибудь может мне сказать, что мне не хватает или как правильно отформатировать запрос?

1 Ответ

7 голосов
/ 23 октября 2010

Использование:

  SELECT a.AccountNo,
         a.ParcelNo,
         a.LocalNo,
         a.PrimaryUseCode, 
         a.DefaultTaxDistrict,
         TRIM(g.Section),
         TRIM(g.Township),
         TRIM(g.Range)
     FROM tblAcct A
LEFT JOIN tblAcctLegalLocation g ON g.accountno = a.accountno
                                AND g.verstart <= '20100917999' 
                                AND g.verend > '20100917999'
    WHERE a.verstart <= '20100917999' 
      AND a.verend > '20100917999' 
      AND a.DefaultTaxDistrict = '2291' 
      AND SUBSTR(a.AccountNo,1,1) IN ('R', 'I') 
      AND SUBSTR(a.ParcelNo,1,1) NOT IN ('7', '8')
      AND a.AcctStatusCode IN ('A', 'T', 'E') 
 ORDER BY a.ParcelNo, a.LocalNo

Все, что вы видите с пометкой (+), должно быть включено в критерии OUTER join.Во внешнем JOIN критерии применяются до объединения.

...