【问题标题】:Find matching records from multiple table using SQL Queries使用 SQL 查询从多个表中查找匹配记录
【发布时间】:2021-03-04 11:34:18
【问题描述】:

我有一个包含所有公司详细信息的主表。在主表中,所有数据都是正确的。我通常会收到包含公司名称和员工详细信息的 Excel 数据。

使用 SSIS ,我曾经将完整的 excel 数据导入到数据库中的新表中。但是在excel中,公司名称不合适。我的要求是基于匹配公司名称需要查找员工详细信息。当我加入具有正确公司名称和新表的主表时,那时我只获取基于确切公司名称匹配的完全匹配记录。

例如,在主表中,我的公司名称为 ABC India Private Limited,但在新表中,公司名称为 ABC pvt。有限公司。当我根据公司名称加入时,这将与公司名称不匹配,并且不会提供该公司的员工详细信息。但我的要求是我应该能够获得员工的详细信息,这些公司名称至少与两个表中的公司名称 ABC 匹配,而与私人有限公司或 pvt 无关。有限公司。如何为此编写 SQL 查询。

要了解更多,请查找示例-

主数据表

公司名称

ABC India Private Limited
XYZ RAK Private Limited
PQR XRK Private Limited

新表

EmpName|CompanyName|Age|Designation
HarishP|ABC pvt. Ltd.|30|Director
Rupeshj|XYZ RAK Ltd.|25|IT Head
RajeshK|PQR XRK Pvt.|45|Engineer 

【问题讨论】:

  • 您已在此处标记了 SQL Server 和 PL/SQL。您真正使用的是什么 RDBMS? SQL Server 使用 T-SQL,而不是 PL/SQL; Oracle 使用 PL/SQL。
  • 至于你的问题,答案是修复数据。 'ABC India Private Limited''ABC pvt. Ltd. 完全不同。他们分享最多的是前 3 个字符。
  • 如果由于某种原因您只能修复数据,您还可以使用映射表将不同的公司名称关联到唯一的公司。但是,当可能的故障增加时,这并不理想且难以维护。
  • 如果“ABC Malaysia Pvt”存在会怎样?还是“ABC孟买列兵”?名字通常非常非常相似。过度简化的样本数据很容易将您引向错误的方向。当公司名称更改(偶尔发生)时,您会怎么做?我可以很容易地预见到需要一个映射过程。

标签: sql sql-server database tsql


【解决方案1】:
CREATE TABLE MasterData(CompanyName nvarchar(255))
CREATE TABLE NewTable (EmpName nvarchar(255),CompanyName varchar(255),Age int,Designation varchar(255))
INSERT INTO MasterData(CompanyName) VALUES('ABC India Private Limited'),
('XYZ RAK Private Limited'),
('PQR XRK Private Limited')
INSERT INTO NewTable(EmpName,CompanyName,Age,Designation)
VALUES('HarishP','ABC pvt. Ltd.',30,'Director'),
('Rupeshj','XYZ RAK Ltd.',25,'IT Head'),
('RajeshK','PQR XRK Pvt.',45,'Engineer')
SELECT N.EmpName,N.Age,N.Designation,M.*
FROM MasterData AS M
INNER JOIN NewTable AS N
  ON N.CompanyName LIKE CONCAT('%', LEFT(M.CompanyName ,3), '%') 
员工姓名 |年龄 |名称 |公司名 :-------- | --: | :------------ | :------------------------ 哈里什P | 30 |导演 | ABC 印度私人有限公司 鲁佩什 | 25 | IT 主管 | XYZ RAK 私人有限公司 拉杰什K | 45 |工程师 | PQR XRK 私人有限公司

db小提琴here

【讨论】:

    【解决方案2】:

    当您将其标记为读作“Oracle”的 PL/SQL 时,看看这是否有帮助。

    如果您使用utl_match 包,您可以计算“相似度”,显示字符串的相似程度(从 0 到 100)。这两个表的交叉连接显示了这一点:

    SQL> with
      2  master (company_name) as
      3    (select 'ABC India Private Limited' from dual union all
      4     select 'XYZ RAK Private Limited'   from dual union all
      5     select 'PQR XRK Private Limited'   from dual
      6    ),
      7  new_table (emp_name, company_name, age, designation) as
      8    (select 'HarishP', 'ABC pvt. Ltd.', 30, 'Director' from dual union all
      9     select 'Rupeshj', 'XYZ RAK Ltd.' , 25, 'IT Head'  from dual union all
     10     select 'RajeshK', 'PQR, XRK Pvt.', 45, 'Engineer' from dual
     11    )
     12  select n.emp_name,
     13         n.company_name new_cname,
     14         m.company_name,
     15         n.age,
     16         n.designation,
     17         utl_match.jaro_winkler_similarity(lower(m.company_name), lower(n.company_name)) sim
     18  from master m cross join new_table n
     19  order by n.company_name, m.company_name;
    
    EMP_NAM NEW_CNAME     COMPANY_NAME                     AGE DESIGNAT        SIM
    ------- ------------- ------------------------- ---------- -------- ----------
    HarishP ABC pvt. Ltd. ABC India Private Limited         30 Director         77
    HarishP ABC pvt. Ltd. PQR XRK Private Limited           30 Director         47
    HarishP ABC pvt. Ltd. XYZ RAK Private Limited           30 Director         52
    RajeshK PQR, XRK Pvt. ABC India Private Limited         45 Engineer         45
    RajeshK PQR, XRK Pvt. PQR XRK Private Limited           45 Engineer         84
    RajeshK PQR, XRK Pvt. XYZ RAK Private Limited           45 Engineer         58
    Rupeshj XYZ RAK Ltd.  ABC India Private Limited         25 IT Head          47
    Rupeshj XYZ RAK Ltd.  PQR XRK Private Limited           25 IT Head          54
    Rupeshj XYZ RAK Ltd.  XYZ RAK Private Limited           25 IT Head          83
    
    9 rows selected.
    
    SQL>
    

    现在,很明显 - 当我们查看它时 - 哪些 company_name 对是可以的,哪些不是。在这种情况下,可接受的限制是例如75 所以如果我们将它包含在 where 子句中,我们会得到:

     <snip>
     12  select n.emp_name,
     13         n.company_name new_cname,
     14         m.company_name,
     15         n.age,
     16         n.designation,
     17         utl_match.jaro_winkler_similarity(lower(m.company_name), lower(n.company_name)) sim
     18  from master m join new_table n
     19    on utl_match.jaro_winkler_similarity(lower(m.company_name), lower(n.company_name)) > 75
     20  order by n.company_name, m.company_name;
    
    EMP_NAM NEW_CNAME     COMPANY_NAME                     AGE DESIGNAT        SIM
    ------- ------------- ------------------------- ---------- -------- ----------
    HarishP ABC pvt. Ltd. ABC India Private Limited         30 Director         77
    RajeshK PQR, XRK Pvt. PQR XRK Private Limited           45 Engineer         84
    Rupeshj XYZ RAK Ltd.  XYZ RAK Private Limited           25 IT Head          83
    
    SQL>
    

    或者,更漂亮:

     <snip>
     12  select n.emp_name,
     13         m.company_name,
     14         n.age,
     15         n.designation
     16  from master m join new_table n
     17    on utl_match.jaro_winkler_similarity(lower(m.company_name), lower(n.company_name)) > 75
     18  order by n.company_name, m.company_name;
    
    EMP_NAM COMPANY_NAME                     AGE DESIGNAT
    ------- ------------------------- ---------- --------
    HarishP ABC India Private Limited         30 Director
    RajeshK PQR XRK Private Limited           45 Engineer
    Rupeshj XYZ RAK Private Limited           25 IT Head
    
    SQL>
    

    但是,它是否适用于您的所有案例?很可能不是。取决于您输入的垃圾的质量。

    【讨论】:

      【解决方案3】:

      由于您不了解数据模式,因此很可能无法使用 Sql 服务器查询。当您使用 SSIS 时,您应该在 SSIS 中使用 "Fuzzy Lookup" 解决此问题。这将是您正确的方法。 关于模糊查找的帮助,您可以查看this URL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多