Sql 左连接,但剥离连接键的一部分

Sql 左连接,但剥离连接键的一部分,sql,sql-server,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

我有以下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
123456  
123456|installed  
123456|assembled
在发票上,我会有相同的SKU,但像这样

123456
123456  
123456|installed  
123456|assembled

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

一种方法是使用
replace
函数

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

一种方法是使用
replace
功能

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

在加入之前,您可以在
invoices.sku
上使用
子字符串
,就像下面的代码一样

在执行
子字符串
之前,在末尾追加一个额外的
“|”
,以处理
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的|一些|文本@leen3o-您甚至可能想要添加一些明确的 如果sku始终是一个数字,可以说是一个ID,则在那里进行铸造MK_


在加入之前,您可以在
invoices.sku
上使用
子字符串
,就像下面的代码一样

在执行
子字符串
之前,在末尾追加一个额外的
“|”
,以处理
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的|一些|文本@leen3o-您甚至可能想要添加一些明确的 如果sku始终是一个数字,可以说是一个ID,则在那里进行铸造MK_


出于性能原因,我建议您将“真实”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
应该有助于在表中编写许多查询。

出于性能原因,我建议您将“真实”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
应该有助于在表中编写许多查询。

这是假设它总是以
sku |一些文本
的格式进行的@leen3o-如果
sku
始终是一个数字,可以说是一个ID,那么您甚至可能想在其中添加一些显式的
CAST
ing。感谢您指出@MK\u,我将在回答中更新相同内容。谢谢。格式总是sku |一些|文本,但sku不总是数字,它可以是任何字符串。我现在会退出,但回来后会尝试。这是基于这样的假设,即它总是以
sku |一些_文本
的格式出现@leen3o-如果
sku
始终是一个数字,可以说是一个ID,那么您甚至可能想在其中添加一些显式的
CAST
ing。感谢您指出@MK\u,我将在回答中更新相同内容。谢谢。格式总是sku |一些|文本,但sku不总是数字,它可以是任何字符串。我现在就出去,回来后再试试。