Oracle SQL - 基于 concat 的外连接

Posted

技术标签:

【中文标题】Oracle SQL - 基于 concat 的外连接【英文标题】:Oracle SQL - Outer join based on concat 【发布时间】:2021-07-24 13:55:44 【问题描述】:

我需要交叉连接两个表,但连接条件是:

Select FutureInventory.Item,
       To_Number(Concat(Location, Channel_Id)) Location,
  From V_CUST_FUTURE_INV_POSITION FutureInventory,
       xx_Item_Loc_Info_V         ItemLoc
 Where FutureInventory.Item(+) = ItemLoc.Item
   And To_Number(Concat(Location, Channel_Id))(+) = ItemLoc.Loc;

我想将列 To_Number(Concat(Location, Channel_Id)) 与 ItemLoc.Loc 外部连接 (+) 符号的放置位置

【问题讨论】:

样本数据、期望的结果以及对逻辑的清晰解释都会有所帮助。 【参考方案1】:

首先,使用显式连接语法 - 旧的 (+) 难以阅读且容易出错。其次,使用|| 运算符而不是CONCAT 函数——同样,更易于阅读。所以我们最终得到了

Select FutureInventory.Item,
       To_Number(Location || Channel_Id) Location,
  From xx_Item_Loc_Info_V ItemLoc
  LEFT OUTER JOIN V_CUST_FUTURE_INV_POSITION FutureInventory,
    ON FutureInventory.Item = ItemLoc.Item And
       To_Number(Location || Channel_Id) = ItemLoc.Loc

【讨论】:

【参考方案2】:

要在 Oracle 中进行外连接,请使用适当的 JOIN 类型——就像在所有其他数据库中一样。我认为你想要的逻辑是:

select FutureInventory.Item,
       To_Number(Concat(Location, Channel_Id)) as Location,
from xx_Item_Loc_Info_V ItemLoc LEFT JOIN
     V_CUST_FUTURE_INV_POSITION FutureInventory,
     on FutureInventory.Item = ItemLoc.Item AND
        To_Number(Concat(Location, Channel_Id)) = ItemLoc.Loc;

【讨论】:

以上是关于Oracle SQL - 基于 concat 的外连接的主要内容,如果未能解决你的问题,请参考以下文章

oracle的sql查询结果拼接

Oracle如何创建一个置空的外键约束?

SQL 中的 STUFF 等效函数(MySQL 中的 GROUP_CONCAT / Oracle 中的 LISTAGG)

Oracle数据库sql 列转字符串行函数WMSYS.WM_CONCAT()

SQL— CONCAT(字符串连接函数)

oracle中sql语句的问题