TSQL - 在多个列中搜索单个值
TSQL - search multiple columns for single value
我们的数据库有以下项目信息:
ItemNumber | ItemDescription | CaseUPC | BoxUPC | UnitUPC
===============================================================================
12345 | Widget | 00487060982629 | 00334556905837 | 00803709021138
23456 | Dunkit | 00442765157512 | 00688083046260 | 00148006723652
34567 | Tiklet | 00671178066801 | 00181369288501 | 00371783583016
我们收到的客户信息通常如下所示:
ItemNumber | UPC
=========================
XPQR | 487060982629
ROFL | 688083046260
WTAF | 371783583016
LOLBBQ | 123456789012
因为我们的大多数客户都不懂计算机,并且使用 Excel 创建他们发送给我们的 CSV 文件,因此缺少 UPC 代码的前导零,但它们是有效代码。
使用 SQL Server 2012,我的任务是将客户提供的 UPC 代码与我们的项目 table 进行匹配,以生成如下所示的报告:
CustomerItemNumber | OurItemNumber | OurItemDescription | MatchMethod
======================================================================
XPQR | 12345 | Widget | CaseUPC
ROFL | 23456 | Dunkit | BoxUPC
WTAF | 34567 | Tiklet | UnitUPC
LOLBBQ | -- | -- | no match found
我尝试使用多个 LEFT JOINS 从客户项目 table 到我们的项目 table:
SELECT C.ItemNumber,
O.ItemNumber,
O.ItemDescription,
O.CaseUPC,
O.BoxUPC,
O.UnitUPC
FROM CustomerItemTable C
LEFT OUTER JOIN OurItemTable O ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O.CaseUPC)), 12)
LEFT OUTER JOIN OurItemTable O2 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O2.BoxUPC)), 12)
LEFT OUTER JOIN OurItemTable O3 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O3.UnitUPC)), 12)
...但我最终得到了重复的记录
如果您知道该列只有数字数据,请在连接中转换它:
... CONVERT(INT, UPC) ...
否则,使用 LIKE 而不是 equals:
... LIKE upc + '%' ...
此外,您应该只加入 table 一次,而不是使用多个 WHERE 子句。
我不太确定您为什么要一遍又一遍地加入相同的 table - 您可以在多个列上使用带有条件的单个连接。
此外,您可以通过转换为 int:
来简单地删除所有前导零
SELECT C.ItemNumber,
O.ItemNumber,
O.ItemDescription,
O.CaseUPC,
O.BoxUPC,
O.UnitUPC
FROM CustomerItemTable C
LEFT OUTER JOIN OurItemTable O
ON CAST(C.UPC AS int) IN(CAST(O.CaseUPC AS INT), CAST(O.BoxUPC AS INT), CAST(O.UnitUPC AS INT))
也就是说,当然,如果 CustomerItemTable 上的 UPC 与 OurItemTable 上的 CaseUPC、BoxUPC 或 UnitUPC 中的任何一个相匹配,假设您想加入 tables。
我们的数据库有以下项目信息:
ItemNumber | ItemDescription | CaseUPC | BoxUPC | UnitUPC
===============================================================================
12345 | Widget | 00487060982629 | 00334556905837 | 00803709021138
23456 | Dunkit | 00442765157512 | 00688083046260 | 00148006723652
34567 | Tiklet | 00671178066801 | 00181369288501 | 00371783583016
我们收到的客户信息通常如下所示:
ItemNumber | UPC
=========================
XPQR | 487060982629
ROFL | 688083046260
WTAF | 371783583016
LOLBBQ | 123456789012
因为我们的大多数客户都不懂计算机,并且使用 Excel 创建他们发送给我们的 CSV 文件,因此缺少 UPC 代码的前导零,但它们是有效代码。
使用 SQL Server 2012,我的任务是将客户提供的 UPC 代码与我们的项目 table 进行匹配,以生成如下所示的报告:
CustomerItemNumber | OurItemNumber | OurItemDescription | MatchMethod
======================================================================
XPQR | 12345 | Widget | CaseUPC
ROFL | 23456 | Dunkit | BoxUPC
WTAF | 34567 | Tiklet | UnitUPC
LOLBBQ | -- | -- | no match found
我尝试使用多个 LEFT JOINS 从客户项目 table 到我们的项目 table:
SELECT C.ItemNumber,
O.ItemNumber,
O.ItemDescription,
O.CaseUPC,
O.BoxUPC,
O.UnitUPC
FROM CustomerItemTable C
LEFT OUTER JOIN OurItemTable O ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O.CaseUPC)), 12)
LEFT OUTER JOIN OurItemTable O2 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O2.BoxUPC)), 12)
LEFT OUTER JOIN OurItemTable O3 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O3.UnitUPC)), 12)
...但我最终得到了重复的记录
如果您知道该列只有数字数据,请在连接中转换它:
... CONVERT(INT, UPC) ...
否则,使用 LIKE 而不是 equals:
... LIKE upc + '%' ...
此外,您应该只加入 table 一次,而不是使用多个 WHERE 子句。
我不太确定您为什么要一遍又一遍地加入相同的 table - 您可以在多个列上使用带有条件的单个连接。 此外,您可以通过转换为 int:
来简单地删除所有前导零SELECT C.ItemNumber,
O.ItemNumber,
O.ItemDescription,
O.CaseUPC,
O.BoxUPC,
O.UnitUPC
FROM CustomerItemTable C
LEFT OUTER JOIN OurItemTable O
ON CAST(C.UPC AS int) IN(CAST(O.CaseUPC AS INT), CAST(O.BoxUPC AS INT), CAST(O.UnitUPC AS INT))
也就是说,当然,如果 CustomerItemTable 上的 UPC 与 OurItemTable 上的 CaseUPC、BoxUPC 或 UnitUPC 中的任何一个相匹配,假设您想加入 tables。