Sql如何加入Colums中数据相似的表

时间:2015-06-12 17:26:36

标签: sql sql-server database

我正在管理一个大型数据库。我想加入一张桌子。但是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 #]

任何帮助都将不胜感激。

5 个答案:

答案 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