Oracle внешнее соединение "сущность" - PullRequest
2 голосов
/ 21 июня 2011

Как вы можете ссылаться на «объединенную сущность», созданную из внешнего соединения в вашем запросе?В частности, как вы можете заменить "??"в запросе ниже:

SELECT TableA.x, 
       ??.y --How do you select from the combined entity?
  FROM TableA, 
       TableB buys 
FULL OUTER JOIN TableB sells ON buys.run_id = sells.run_id 
                            AND buys.specie_id = sells.specie_id 
                            AND buys.account_id = sells.account_id
WHERE TableA.id = ?? 
  AND -- want to join this with the "combined entity" resulting from the outer join
      buys.buy = 'Y' 
  AND -- Is this valid or does this have to be within the Outer join statement?
      sells.buy = 'N';

Ответы [ 3 ]

3 голосов
/ 21 июня 2011
select TableA.x, fullTable.y 
from TableA 
  INNER JOIN
    ( SELECT y
        FROM TableB buys
          full outer join TableB sells
            on buys.run_id = sells.run_id
            and buys.specie_id = sells.specie_id
            and buys.account_id = sells.account_id
            AND buys.buy = 'Y' AND sells.buy = 'N'    
    ) AS fullTable
    ON TableA.id = fullTable.y

Условие может быть в финале WHERE или ON, например, но оно по существу отменяет полное соединение:

select TableA.x, fullTable.y 
from TableA 
  INNER JOIN
    ( SELECT y
           , buys.buy AS buysBuy             --- fields here so they can be
           , sells.buy AS sellsBuy           --- used in the final WHERE or ON
        FROM TableB buys
          full outer join TableB sells
            on buys.run_id = sells.run_id
            and buys.specie_id = sells.specie_id
            and buys.account_id = sells.account_id                
    ) AS fullTable
    ON TableA.id = fullTable.y
    AND buysBuy = 'Y' AND sellsBuy = 'N'    --- the condition here
2 голосов
/ 21 июня 2011

Предположительно, вы пытаетесь спросить, как ссылаться на столбцы, используемые в соединении в других частях запроса. Там нет объединенной сущности как таковой; вам все равно придется ссылаться на столбцы из таблиц (в этом случае «покупает» или «продает», просто случается, что столбцы, используемые в объединении, будут иметь одинаковое значение для обеих таблиц.

Если вы хотите, чтобы значение не было нулевым (поскольку это полное внешнее объединение), вы можете использовать coalesce или nvl, чтобы найти ненулевое значение:

SELECT TableA.x, 
       nvl(buys.run_id,sells.run_id) as run_id,
       ...
1 голос
/ 21 июня 2011

Вам нужны предикаты sells.buy = 'N' и buys.buy = 'Y' во внешнем соединении.

SELECT TableA.x, 
       ??.y --How do you select from the combined entity?
  FROM TableA, 
INNER JOIN TableB buys ON <whatever>
                      AND buys.buy = 'Y' 
FULL OUTER JOIN TableB sells ON buys.run_id = sells.run_id 
                            AND buys.specie_id = sells.specie_id 
                            AND buys.account_id = sells.account_id
                            AND sells.buy = 'N'

Что касается ??.y, вам нужно указать, из какой таблицы вы хотите - - TableA, buy или sell.

...