【问题标题】:Is it efficient to create a new column in SQL Server and find only matching data in the new column?在 SQL Server 中创建新列并在新列中仅查找匹配数据是否有效?
【发布时间】:2019-10-28 15:54:37
【问题描述】:

我想知道以下过程是否有效,或者是否有更好的方法来解决这个问题:

表格由 4 个相关列组成:

  • 身份证
  • 出生日期 (1984-03-19)
  • 名字(约翰)
  • 姓氏(Doe)

我想连接这些列以创建“1984-03-19 John Doe”作为新列。然后我想以这种格式获取一个值列表(有一个包含 DOB、First、Last name 的 .csv 文件),并且只有在匹配时才从表中提取 Id。 p>

该表有数百万行,所以我想知道是否有更有效的方法来编写此查询。

这是针对临时请求的。

【问题讨论】:

  • 你为什么想要这样做?
  • 我很遗憾约翰确实在同一天出生。
  • @Larnu - 我有一个这种连接格式的大约 1k 个值的列表。我试图从表中找到他们的“Id”值。唯一需要比较的字段是 Dob、First 和 Last Name。
  • 如果你想搜索表格,然后传递每一列的值:WHERE Firstname = 'John' AND LastName = 'Doe' AND DoB = '19870319' 执行WHERE FirstName + LastName + DoB = ... 之类的操作会导致转换错误,如果您执行CONVERT @987654324 @ 它不会是一个 SARGable 查询 *由于 CONVERT 和连接)。如果查询速度很慢,可能是由于索引不佳或缺乏索引,
  • 您是说您已经有一个不同的表,其中包含“DOB First Last”作为您要与之比较的字段?如果是这样,您可以按照您的描述进行操作,或者我可能更喜欢相反的方法 - 将另一个字段拆分为 DOB、first、last,然后执行 DOB=DOB, first=first, last=last。

标签: sql sql-server


【解决方案1】:

您应该将 CSV 文件加载到表格中。我们称之为 CSV。

我们将调用您的原始表t

那你想要一个简单的JOIN

select t.id
from csv join
     t
     on t.firstname = csv.firstname and
        t.lastname = csv.lastname and
        t.dob = csv.dob;

瞧!完毕。没有串联。

为了提高性能,您需要在t(firstname, lastname, dob) 上创建一个索引,其中的列可以按任意顺序排列。

【讨论】:

  • 非常感谢。加入这些值而不是创建一个新的键来搜索,t(firstname, lastname, dob) 上的索引是我需要从性能角度了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2019-07-15
相关资源
最近更新 更多