Sql Oracle外部联接“实体”

Sql Oracle外部联接“实体”,sql,oracle,full-outer-join,Sql,Oracle,Full Outer Join,如何在查询中引用从外部联接创建的组合实体?具体来说,如何更换??在下面的查询中: 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.

如何在查询中引用从外部联接创建的组合实体?具体来说,如何更换??在下面的查询中:

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';
条件可以在final 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

您可能想问的是如何在查询的其他部分中引用联接中使用的列。本身不存在联合实体;在本例中,您仍然必须引用表中的列。在购买或出售的情况下,连接中使用的列恰好对两个表具有相同的值

由于这是一个完整的外部联接,如果希望使用非null值,可以使用coalesce或nvl查找非null值:

SELECT TableA.x, 
       nvl(buys.run_id,sells.run_id) as run_id,
       ...
在外部联接中需要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

我在查询的AS fullTable部分得到ORA-00905:缺少关键字。@Marcus:哪个Oracle版本?@Marcus:我想您已经删除了注释:--这里是这个条件。否则我看不到任何错误。@托尼:我不明白为什么你说它对sells.buy='N'重要,但对buys.buy='Y'不重要,因为使用外部联接的目的是允许它返回没有相应外部表行的内部表行。一旦您将where outer.col=value添加到查询中,您就不再有外部联接-您已将其强制回内部联接,因为任何空值都与谓词不匹配。@Tony:我同意,联接被取消。但我不明白这两种情况之间的区别。它们都使用完全联接中的字段。buys.buy是内部表中的一列,而不是外部表中的一列,因此没有要取消的外部联接。@Tony,这是完全外部联接,意味着两个方向上的外部联接。
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'