我正在尝试建立两个表的联接逻辑,如果要采用“按列1联接,如果未联接-按列2,如果不联接-按列3联接”的方式,则需要选择联接条件。我在用简单的方法构建它时遇到了麻烦。
仅提供一些背景知识,我尝试查找合同涵盖的所有产品。有时在ProductId中明确提到了产品,但是如果连接失败(由于提供了错误的ProductId),我想使用品牌名称来查找该品牌下的所有产品,并假定所有产品都已包含在合同中。品牌名称匹配将不太准确,因此,仅在无法通过ProductId查找匹配的产品时,我才想使用它。
为说明起见,假设我有两个表:Prosucts,带有ProductId和BrandName列;还使用表ContractId,Brand,ProductId,Value表Contracts。对于此表,ProductId和Brand可以为null,或具有不在Products中的值。
我想加入具有以下条件的产品合同:
有没有办法使这种顺序连接逻辑逐个尝试连接条件?为了强调我在现实中有两个以上的加入条件。谢谢!
示例数据:
合同:
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
答案 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()
函数的联接
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