【问题标题】:Oracle outer join "entity"Oracle 外连接“实体”
【发布时间】:2011-06-21 14:46:05
【问题描述】:

如何在查询中引用从外部联接创建的“组合实体”?具体如何替换“??”在下面的查询中:

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';

【问题讨论】:

    标签: sql oracle full-outer-join


    【解决方案1】:
    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
    

    条件可以像这样在最后的WHEREON 中,但它实际上取消了完全连接:

    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
    

    【讨论】:

    • 我在查询的AS fullTable 部分得到ORA-00905: missing keyword
    • @Marcus:哪个 Oracle 版本?
    • @Marcus:我想你已经删除了评论:--- this condition here。否则我看不到任何错误。
    【解决方案2】:

    大概您想问的是如何在查询的其他部分引用连接中使用的列。本身没有联合实体;您仍然必须引用表中的列(在本例中为“买入”或“卖出”,只是碰巧在连接中使用的列对于两个表具有相同的值。

    如果你想要哪个不为空(因为这是一个全外连接),你可以使用coalescenvl 来查找非空值:

    SELECT TableA.x, 
           nvl(buys.run_id,sells.run_id) as run_id,
           ...
    

    【讨论】:

      【解决方案3】:

      您需要在外连接中使用 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,您需要指定要从哪个表中获取它-TableAbuysell

      【讨论】:

      • @Tony:我不明白你为什么说这对sells.buy = 'N' 很重要,但对buys.buy = 'Y' 不重要
      • 因为外部连接的目的是允许它返回没有对应外部表行的内部表行。一旦您在查询中添加“where outer.col = value”,您就不再有外连接 - 您已将其强制返回到内连接(因为任何空值都不会匹配谓词)。
      • @Tony:我同意这一点,加入已取消。但我不明白这两种情况之间的区别。它们都使用完全连接中的字段。
      • buys.buy 是来自“内部”表的列,而不是“外部”表,因此没有要取消的外部联接(到 buys)。
      • @Tony,这是一个FULL OUTER JOIN,表示双向外连接。
      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多