我正在管理一个大型数据库。我想加入一张桌子。但是Colums中的数据实际上并不匹配。一个有破折号,另一个有空间。 公司表中的GPD 142 pol(Partnumber)和Customer表中的GPD-142-pol(PartNumber)。
我的查询是这样写的:
SELECT *
FROM CompanyPartsList
JOIN SalesReport
On FordPartsList.[Company Part Number] = SalesReport.[Customer Part #]
我尝试这样的事情
SELECT *
FROM CompanyPartsList
JOIN SalesReport
On FordPartsList.[Company Part Number] Like SalesReport.[Customer Part #]
任何帮助都将不胜感激。
答案 0 :(得分:3)
再次执行此操作将非常缓慢,解决方案将是在任一侧创建正确格式化列的触发器
SELECT *
FROM CompanyPartsList
JOIN SalesReport
On FordPartsList.[Company Part Number] = Replace(SalesReport.[Customer Part #],'-',' ')
答案 1 :(得分:1)
尝试替换可能导致值不同的字符。
SELECT
*
FROM
CompanyPartsList cpl,
SalesReport sr
WHERE
REPLACE(REPLACE(cpl.[Company Part Number],'-',''),' ','') = REPLACE(REPLACE(sr.[Customer Part #],'-',''),' ','')
答案 2 :(得分:0)
在一天结束时,为了使JOIN起作用,您必须具有匹配的值。因此,你唯一的选择是找到一种方法使它们平等。
根据您的示例,我试验一下您是否可以将值标准化为标准。例如,您可以尝试使用REPLACE删除两侧的所有空格和连字符,并查看是否适合您。
如果您能够以这种方式获得比赛,那么您有两个选择。当你进行JOIN时,你总是可以在运行时进行规范化,但这可能会使性能过高。或者您可以在每个表中添加另一列,在更新实部#时同时更新该列,将其设置为该值,并删除空格,连字符等。
除了头痛之外,你的潜在问题是冲突的可能性。如果你有#s" 123-4B"和" 12-34B"?如果您使用我的提案,那么这两个产品看起来是一样的。
答案 3 :(得分:0)
创建question 1007697中提到的函数并轻轻修改它以除去字母和数字之外的任何内容
Create Function [dbo].[RemoveNonAlphaNumericCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z0-9]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
然后你可以比较数据,但在大桌子上可能会很慢:
SELECT *
FROM CompanyPartsList
JOIN SalesReport
On RemoveNonAlphaNumericCharacters(FordPartsList.[Company Part Number])
= RemoveNonAlphaNumericCharacters(SalesReport.[Customer Part #])
答案 4 :(得分:0)
如果您最终想要使用函数,我建议使用内联表值函数而不是内部有while循环的标量函数。随着表变大,该标量函数的性能将迅速降低。下面是使用内联表值函数和计数表的示例,因此替换是基于设置的。
如果这是我的代码,我宁愿使用REPLACE选项,如果可能的话。
CREATE FUNCTION [dbo].[StripNonAlphaNumeric_itvf]
(
@OriginalText VARCHAR(8000)
) RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH
E1(N) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
Tally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select STUFF(
(
SELECT SUBSTRING(@OriginalText, t.N, 1)
FROM tally t
WHERE
(
ASCII(SUBSTRING(@OriginalText, t.N, 1)) BETWEEN 48 AND 57 --numbers 0 - 9
OR
ASCII(SUBSTRING(@OriginalText, t.N, 1)) BETWEEN 65 AND 90 --UPPERCASE letters
OR
ASCII(SUBSTRING(@OriginalText, t.N, 1)) BETWEEN 97 AND 122 --LOWERCASE letters
)
AND n <= len(@OriginalText)
FOR XML PATH('')
), 1 ,0 , '') AS CleanedText