【问题标题】:Lookup multiple columns based on their names in Azure SQL Server根据 Azure SQL Server 中的名称查找多个列
【发布时间】:2021-06-15 05:06:31
【问题描述】:

问题:我有 100 个表,它们的全名、出生日期、电子邮件和 ID 可以有不同的列名。例如:表 1 全名为 Emp name、dob、work email 和 national id。表 2 可能有 Full Nm、出生日期、Wrk 电子邮件、NID,而表 3 可能有 Full Name、出生日期、Work Em、NatID 等..对于 10 个或更多不同的表

全名+出生日期被视为唯一列

我需要的是一个查询或一种自动方式来选择那些可能具有不同名称的列,并根据具有这些列及其值(全名、出生日期、工作电子邮件、国家 ID)的参考表查找这些列值) 如果我找到了匹配项,那么

期望的结果:我需要检索找到匹配的表名、找到匹配的列名、匹配的值,如果找不到匹配则返回“不匹配”

我尝试使用INFORMATION_SCHEMA.COLUMNS,但还没有运气。任何帮助将不胜感激

【问题讨论】:

    标签: sql string-matching lookup-tables azure-sql-server


    【解决方案1】:

    我认为您可以查看INFORMATION_SCHEMA.COLUMNS。除非我没跟着你,否则你一定能做到吗?

    select c.COLUMN_NAME, IsNull(m.Found,'No Match') Matches
    from INFORMATION_SCHEMA.COLUMNS c
    outer apply (
        select column_name + ' is in ' + table_name Found
        from INFORMATION_SCHEMA.COLUMNS x
        where x.COLUMN_NAME =c.COLUMN_NAME and x.TABLE_NAME !=c.TABLE_NAME
    )m
    where c.table_name='MasterList'
    

    使用您想在其他表中定位的所有列变体创建您的 MasterList 表,然后这将列出数据库中的所有表以及匹配的列。

    【讨论】:

      【解决方案2】:

      如果它有 10 个表,那么大概您可以提前检查它们并知道您要查看哪些列。然后挑战是将所有这些组合到一个查询中。你可以用一堆 UNION 来做,像这样:

      select [Emp name] as Name, [dob] as DateOfBirth, [work email] as Email, [national id] as ID, 'Table1' as TableName
      from Table1
      UNION 
      select [Full Nm] as Name, [date of birth] as DateOfBirth, [Wrk Email] as Email, [NID] as ID, 'Table2' as TableName
      from Table2
      UNION
      select [Full Name] as Name, [birth date] as DateOfBirth, [Work Em] as Email, [NatID] as ID, 'Table3' as TableName
      from Table3
      UNION
      --etc etc
      

      注意我们如何添加一个 TableName 列来告诉我们每个项目来自哪个表。

      要查询整个数据集,您需要将其声明为视图或类似的东西,或者将其嵌套在另一个 SELECT 中,如下所示:

      select Name, DateOfBirth, Email, ID, TableName
      from (
          select [Emp name] as Name, [dob] as DateOfBirth, [work email] as Email, [national id] as ID, 'Table1' as TableName
          from Table1
          UNION 
          select [Full Nm] as Name, [date of birth] as DateOfBirth, [Wrk Email] as Email, [NID] as ID, 'Table2' as TableName
          from Table2
          UNION
          select [Full Name] as Name, [birth date] as DateOfBirth, [Work Em] as Email, [NatID] as ID, 'Table3' as TableName
          from Table3
          UNION
          --etc etc
      ) giveitaname
      WHERE [Name] = 'Joe Bloggs' and [DateOfBirth] = '01/Feb/1999'
      

      【讨论】:

      • 感谢您的评论。我预计到现在我的 poc 将是 10,但实际上它可能不止于此,可能是 60-100 个我正在转换为 sql 表的 excel 文件。另外,我们如何查看参考表? .我不想查看每个表并找出列的名称是什么,需要更动态的东西
      • 这很难,因为您必须在识别列名时使用模糊逻辑。也许这些列总是按相同的顺序排列?
      • 并不总是以相同的顺序。我尝试了类似的方法,但不确定如何将其转换为我的要求。
      • 声明 cmd NVARCHAR(MAX); SET cmd = STUFF(( SELECT ' UNION ALL SELECT '+QUOTENAME(COLUMN_NAME)+' FROM '+QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%email%' ORDER BY TABLE_NAME FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,11,'') ;执行(@cmd);
      • @cmd=cmd 在上述查询中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2019-01-18
      • 2021-07-20
      相关资源
      最近更新 更多