比较两个名字和姓氏列表以查找匹配项

时间:2015-10-14 22:45:02

标签: python sql sql-server linux

我目前在SQL Server中有两个表:TableA有40,000条记录,TableB有210万条记录 每个表有3列:RowID,First_Name和Last_Name。

我目前从TableA的第一行获取First和Last名称,并将其与TableB中的每一行中的First和Last名称进行比较,直到找到匹配项。但是,正如您可能想象的那样,我的计算机没有足够/足够强大的资源来完成此任务。它将运行几个小时然后SQL Server将崩溃,并且它不会保存它已经完成的任何工作。我想过只允许循环运行一定数量的记录,然后从那里重新启动循环,这样我就可以在SQL崩溃之前保留一些数据,但这将需要永远。

我正在寻找其他程序或语言的建议来解决这个问题。在此期间,我将继续尝试完善我的SQL查询以加快此过程,例如只有比较记录,如果它们具有相同的首字母。我对其他程序或语言并不是很了解,所以我很乐意尝试SQL Server以外的其他程序。我不知道是否有一种语言可以提供更好的资源,或者更好地使用“超时”而不是SQL Server。我对Linux了解很多,所以如果有一些东西我可以利用Linux来节省一些与Windows 8相比的资源,我肯定会对此持开放态度。我不知道Python之类的东西是否会更好用,Linux版本的SQL等等?

感谢您的帮助,感谢您的时间!

编辑-----这是我正在运行的查询的简单版本。

DECLARE TableANameF     ,TableANameL
    ,TableBNameF        ,TableBNameL
    ,TableARowIndex     ,TableBRowIndex
    ,TableARowCount     ,TableBRowCount
    ,NameFDifference    ,NameLDifference

SET TableARowIndex = 1

SELECT TableARowCount = COUNT(RowID)
FROM TableA

WHILE (TableARowIndex <= TableARowCount)
    SELECT TableANameF = FIRST_Name
        ,TableANameL = LAST_Name
    FROM TableA
    WHERE RowID = TableARowIndex

    SET TableBRowIndex = 1

    SELECT TableBRowCount = COUNT(RowID)
    FROM TableB

    WHILE (TableBRowIndex <= TableBRowCount)
        SELECT TableBNameF = FIRST_Name
            ,TableBNameL = LAST_Name
        FROM TableB
        WHERE RowID = TableBRowIndex

        SET NameFDifference = DIFFERENCE(TableANameF, TableBNameF)
        SET NameLDifference = DIFFERENCE(TableANameL, TableBNameL)

        IF (NameFDifference > 3 AND NameLDifference > 3)
            --INSERT INTO ANOTHER TABLE TO TRACK MY MATCHES
      --INCREMENT TableBRowIndex
  --END TABLE B WHILE LOOP
 --INCREMENT TableARowIndex
END

2 个答案:

答案 0 :(得分:2)

如果您在两个表上为first_namelast_name创建索引,那么这应该非常快。

SELECT A.*
FROM  TableA A
INNER JOIN TableB B
        ON DIFFERENCE(TableANameF, TableBNameF) > 3
       AND DIFFERENCE(TableANameL, TableBNameL) > 3

这里的问题是DIFFERENCE不会使用任何索引。

另一个解决方案是创建一个存储过程来运行您所做的查询并将索引保​​存在另一个表中,这样您就可以在查询失败时恢复它。

答案 1 :(得分:2)

我认为你只需要索引:

create index idx_tablea_firstname_lastname on tablea(firstname, lastname);
create index idx_tableb_firstname_lastname on tableb(firstname, lastname);

我不确定你想要得到什么,但你应该在数据库中进行查询而不是循环:

select a.*, b.rowid
from tablea a join
     tableb b
     on a.firstname = b.firstname and a.lastname = b.lastname;

SQL是解决此问题的正确语言/工具。您只需要允许数据库完成工作。