Sql server 通过输入不完整的ID号,从StudentTable中获取正确的studentID

Sql server 通过输入不完整的ID号,从StudentTable中获取正确的studentID,sql-server,tsql,Sql Server,Tsql,我有一些学生在结尾缺少一些字符。我需要从学生表中找到最匹配的正确ID号 我下面的脚本需要时间来完成,因为我有很多学生 请给我一个更好的建议。我想添加所有不完整的ID并获得正确的ID,如 if studentID like ('JG853102%','SE686104%','SE686104%') 然后从我的表中找到最接近的匹配项 选择名字、姓氏、学生ID 从学生桌 如果学生喜欢“JG853102%” 或者学生喜欢“SE686104%” 或者学生喜欢“SE686104%” 然而,正如我在评论中提

我有一些学生在结尾缺少一些字符。我需要从学生表中找到最匹配的正确ID号

我下面的脚本需要时间来完成,因为我有很多学生

请给我一个更好的建议。我想添加所有不完整的ID并获得正确的ID,如

if studentID like ('JG853102%','SE686104%','SE686104%')
然后从我的表中找到最接近的匹配项

选择名字、姓氏、学生ID 从学生桌 如果学生喜欢“JG853102%” 或者学生喜欢“SE686104%” 或者学生喜欢“SE686104%” 然而,正如我在评论中提到的,您的查询是可搜索的,WHERE永远不可能是真的。您正在检查StudentID的值是否以“JG853102”和“SE686104”开头。这显然是不可能的,因为字符串不能以两组完全不同的字符开头。因此,您很可能需要一个OR

但是,查询速度慢的原因可能是缺少任何类型的索引。在名为StudentTable的表和名为StudentID的列上,可以假定这是您的主键,这意味着它已经被索引了。这强烈表明情况并非如此。基于该值,尽管它看起来不是一个始终递增的值,这意味着它可能不是一个很好的聚集索引候选对象。如果总是升序,那么将主键创建为集群主键可能会使查询更好:

ALTER TABLE dbo.StudentTable ADD CONSTRAINT PK_StudentTable主键CLUSTERED StudentID; 由于聚集索引自动包含表中的所有列,因此它将首先是列的覆盖索引,同时也是姓氏的覆盖索引

如果该值不总是递增的,则需要创建一个单独的索引。就我们所拥有的而言,这将至少包括以下内容:

ALTER TABLE dbo.StudentTable ADD CONSTRAINT PK_StudentTable主键非聚集StudentID; 在dbo上创建索引IX_StudentTable_StudentID。StudentTable StudentID包括第一个,姓氏; 如果表StudentTable中有更多的列,那么如果可以的话,我将包括所有这些列

最后,您可能会发现带有EXISTS的表变量或值构造可能比or更有效。这将如下所示:

-价值观 选择第一个作为[名称], 姓 学生 来自dbo.StudentTable ST 在存在的位置选择1 从值“JG853102%”中, “SE686104%”VStudentID ST.StudentID喜欢V.StudentID; -变数 声明@IDs table StudentID varchar10; 插入到@IDs中 值“JG853102%”, ‘SE686104%’; 选择第一个作为[名称], 姓 学生 来自dbo.StudentTable ST 在存在的位置选择1 来自@IDS I ST.StudentID喜欢I.StudentID;
请显示完整的表架构和当前执行planThat,其中永远不会为真。值不能类似于“JG853102%”和“SE686104%”。看来你想要一个手术室。此外,上面的查询实际上是可搜索的,尽管EXISTS to a TVP/VALUES构造可能更好,所以我认为它之所以慢是因为缺少索引。表StudentTable上有哪些索引?如何知道缺少字符?是否仅仅基于该列中的字符数?您的脚本(如果有效的话)将重点放在3个特定值和3个特定行上,这与您关于添加所有不完整ID的声明相矛盾。为什么没有约束或FK来阻止这些问题?很抱歉我的错误是,或者“Foo”更接近“Foop”或“Foon”?没有最接近匹配的精确定义,我们只是猜测。值查询工作得很好。非常感谢@Larnu