连接两个表-多个条件。如果未与先前条件合并,则将使用后续条件

时间:2018-10-30 04:22:28

标签: sql join left-join sap

我正在尝试建立两个表的联接逻辑,如果要采用“按列1联接,如果未联接-按列2,如果不联接-按列3联接”的方式,则需要选择联接条件。我在用简单的方法构建它时遇到了麻烦。

仅提供一些背景知识,我尝试查找合同涵盖的所有产品。有时在ProductId中明确提到了产品,但是如果连接失败(由于提供了错误的ProductId),我想使用品牌名称来查找该品牌下的所有产品,并假定所有产品都已包含在合同中。品牌名称匹配将不太准确,因此,仅在无法通过ProductId查找匹配的产品时,我才想使用它。

为说明起见,假设我有两个表:Prosucts,带有ProductId和BrandName列;还使用表ContractId,Brand,ProductId,Value表Contracts。对于此表,ProductId和Brand可以为null,或具有不在Products中的值。

我想加入具有以下条件的产品合同:

  • 尝试在Contracts.ProductId = Products.ProductId
  • 处加入联接
  • 对于未成功加入的合同中的那些条目,请加入到其中Contracts.Brand = Products.Brand的产品中
  • 如果两个连接条件均失败,请返回null

有没有办法使这种顺序连接逻辑逐个尝试连接条件?为了强调我在现实中有两个以上的加入条件。谢谢!

示例数据:

合同:

ContractId  Brand   ProductId
C1  Mars    P1
C2  Nestle  P2
C3  PepsiCo P3

产品

ProductId   Brand
P1  NULL
P2  Mars
P4  PepsiCo
P5  PepsiCo

预期产量

ContractId  ProductId
C1  P1
C2  P2
C3  P4
C3  P5

2 个答案:

答案 0 :(得分:1)

您可以尝试这样:

select p.productId, p.brandName, c.contractId 
from Products p left join Contracts c on
(p.productId = c.productId or p.productId=c.brand);

此处or子句将帮助您获得所需的输出。

答案 1 :(得分:1)

您可以在下面尝试使用多个合约表实例和coalesce()函数的联接

DEMO:

 select productid,coalesce(c.brand,b.brand) as brand 
    from Products a left join Contracts b on a.brand=b.brand 
    left join Contracts c on a.productid=c.productid