Sql 左连接,但剥离连接键的一部分
我有以下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
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不总是数字,它可以是任何字符串。我现在就出去,回来后再试试。