左连接但删除连接键的一部分

时间:2018-04-22 08:24:50

标签: sql sql-server

我有以下SQL查询

SELECT 
    productVariants.productKey
FROM
    [merchProductVariant] productVariants
LEFT JOIN 
    [merchInvoiceItem] invoices ON productVariants.sku = invoices.sku
WHERE 
    invoices.sku IS NULL
GROUP BY 
    productVariants.productKey

但是,在我在invoices.sku上加入productVariants.sku之前,我需要从invoices.sku中删除一些文字

在invoices.sku专栏中有一个例子。一些SKU附加了几个自定义字符串。这些是

|installed and |assembled

所以在merchProductVariant中,我会有像这样的SKU

123456

在发票中,我将拥有相同的SKU但是喜欢这个

123456  
123456|installed  
123456|assembled

我需要能够剥离那些管道串,以便我可以匹配它们。或者查询将它们作为单独的SKU。

3 个答案:

答案 0 :(得分:2)

您可以在SUBSTRING之前使用invoices.sku,然后加入以下代码。

在执行'|'之前最后添加SUBSTRING来处理没有'|'的场景字符存在于invoices.sku列中。

SELECT 
    productVariants.productKey
FROM
    [merchProductVariant] productVariants
LEFT JOIN 
    [merchInvoiceItem] invoices ON productVariants.sku = SUBSTRING(invoices.sku +'|',0, CHARINDEX('|', invoices.sku + '|'))  
WHERE 
    invoices.sku IS NULL
GROUP BY 
    productVariants.productKey

也可以通过以下方式使用LIKE完成。

 ON  invoices.sku + '|' LIKE productVariants.sku + '|%'

注意:

  

这是假设它总是采用格式   sku | some_text。 @ leen3o - 您甚至可能想要添加一些明确的内容   如果sku始终是一个数字,那么就可以在那里进行表达。 - MK _

答案 1 :(得分:2)

出于性能原因,我建议您添加" real" sku到发票表。然后,您可以将其编入索引并简化查询:

alter table merchInvoiceItem
    add sku_real as (left(sku, charindex('|', sku + '|')) persisted;

create index idx_merchInvoiceItem_sku_real on merchInvoiceItem(sku_real);

然后您可以将查询编写为:

SELECT pv.productKey
FROM merchProductVariant mpv LEFT JOIN 
     merchInvoiceItem i
     ON mpv.sku = i.sku_real
WHERE i.sku IS NULL
GROUP BY pv.productKey;

在表格中使用正确的sku应该有助于在桌面上写下许多查询。

答案 2 :(得分:1)

一种方法是使用replace函数

productVariants.sku = replace(replace(invoices.sku, '|installed', ''), '|assembled', '')