Sql server T-SQL |更好地替代不存在的地方

Sql server T-SQL |更好地替代不存在的地方,sql-server,tsql,staging-table,Sql Server,Tsql,Staging Table,我有以下疑问: INSERT INTO [Table A] ([student_name], [class_id],[contact_detail], [birth_date],[note_average]) SELECT [student_name] = case when CHARINDEX('.', [student_name])>0 then LEFT([student_name],CHARINDEX('.', [student_name])-1)

我有以下疑问:

INSERT INTO [Table A]  ([student_name], [class_id],[contact_detail], [birth_date],[note_average])
            SELECT [student_name] = case when CHARINDEX('.', [student_name])>0 then LEFT([student_name],CHARINDEX('.', [student_name])-1)
                        else [student_name] end
                        ,[class_id]
                        ,case when reverse(SUBSTRING(REVERSE([contact_detail]),1,CHARINDEX(':', REVERSE([contact_detail])))) like ':' 
                                        then ([contact_detail] + '|')
                                        else    [contact_detail]
                                        end as [contact_detail]
                         ,[birth_date]
                         ,CAST([note_average] AS decimal(13,2)) as [note_average]
                         ,GETDATE()
            FROM [Table A] 
            WHERE CAST([birth_date] AS DATE) <= CAST(GETDATE() AS DATE)
                    AND LEN([student_name]) >= 5
                    AND NOT EXISTS
                            (
                      SELECT [student_name]
                                              ,[class_id]
                                              ,[contact_detail]
                                              ,[birth_date]
                      FROM [Table A]  a
                      WHERE  '%' + ods.[student_name] + '%' LIKE a.[student_name]
                                AND '%' +  ods.[class_id] + '%'  LIKE a.[class_id]
                                AND '%' + ods.[contact_detail] + '%' LIKE a.[contact_detail]
                                AND ods.[birth_date] = a.[birth_date]
                            )
GO
插入[表A]([学生姓名],[班级id],[联系方式],[出生日期],[备注平均值])
选择[student_name]=当CHARINDEX('.',[student_name])>0时的大小写,然后左([student_name],CHARINDEX('.',[student_name])-1)
else[学生姓名]结束
,[class_id]
,反转时的大小写(子字符串(反转([contact_detail]),1,CHARINDEX(“:”,反转([contact_detail]))类似“:”
然后([contact_detail]+'|')
其他[联系方式详情]
结束为[联系方式详情]
,[出生日期]
,将([注释平均值]转换为十进制(13,2))转换为[注释平均值]
,GETDATE()
来自[表A]
演员阵容([出生日期]为日期)=5
而且不存在
(
选择[学生姓名]
,[class_id]
,[联系方式详情]
,[出生日期]
从[表A]A
其中“%”+ods。[学生名称]+“%”类似于[学生名称]
和“%”+ods。[class_id]+“%”类似于[class_id]
和“%”+ods。[联系人详细信息]+“%”类似于[联系人详细信息]
和ods。[出生日期]=a[出生日期]
)
去
我不想插入重复的值,而且我的表中没有键。我的问题是:此查询需要花费大量时间来插入新值。我正在尝试插入1000000行

我有哪些选择


非常感谢

假设您真的想匹配完全重复的匹配,请尝试以下方法:

INSERT INTO [Table A]  ([student_name], [os_name], [class_id],[contact_detail], [birth_date],[note_average])
    SELECT ods.[student_name] = case when CHARINDEX('.', ods.[student_name])>0 then LEFT(ods.[student_name],CHARINDEX('.', ods.[student_name])-1)
            else ods.[student_name] end
        ,ods.[class_id]
        ,case when reverse(SUBSTRING(REVERSE(ods.[contact_detail]),1,CHARINDEX(':', REVERSE(ods.[contact_detail])))) like ':' 
            then (ods.[contact_detail] + '|')
            else    ods.[contact_detail]
            end as [contact_detail]
         ,ods.[birth_date]
         ,CAST(ods.[note_average] AS decimal(13,2)) as ods.[note_average]
         ,GETDATE()
    FROM [Table A] ods
    OUTER JOIN [Table A] a ON ods.[student_name] = a.[student_name]
        AND ods.[os_name] = a.[os_name]
        AND ods.[class_id] = a.[class_id]
        AND ods.[contact_detail] = a.[contact_detail]
        AND ods.[birth_date] = a.[birth_date]
    WHERE CAST(ods.[birth_date] AS DATE) <= CAST(GETDATE() AS DATE)
        AND LEN(ods.[student_name]) >= 5
        -- Only include when no matching duplicate is found.
        AND a.[student_name] IS NULL

一旦这个查询正常工作,如果需要更好的性能,就可以考虑添加索引。您可能只需要在[birth_date]或[student_name]上添加一个索引即可获得可接受的查询性能。

我认为将
Not Exists
子句中的select替换为
select'x'From…
性能更好,因为一旦找到第一个匹配项,它就会转储。@John_Rodgers-你真的想用LIKE进行比较吗?您是在寻找精确匹配还是类似匹配?特别是对于“班级id”之类的内容,[学生姓名],[班级id],[联系方式],[出生日期]字段成为我表格的业务键。这就是为什么我把所有这些comparasions@John_Rodgers-这是有道理的,我只是质疑出于优化目的使用LIKE vs equals。换句话说,只有在真正需要时才使用LIKE。
存在
子句忽略
选择
中的列列表。所以
选择0
是没有意义的。如果你想要一些特别的东西,你可以写
存在(选择1/0
-它仍然有效。@Alex-完全同意你的观点。这没关系,这正是我试图表达的观点。虽然我的例子可能不好(但我通常使用的是这个)。
AND NOT EXISTS
(
  SELECT 0
  FROM [Table A]  a
  WHERE  ods.[student_name] = a.[student_name]
            AND ods.[os_name] = a.[os_name]
            AND ods.[class_id] = a.[class_id]
            AND ods.[contact_detail] = a.[contact_detail]
            AND ods.[birth_date] = a.[birth_date]
        )