【发布时间】:2017-07-04 15:10:18
【问题描述】:
我有以下查询:
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
我不想插入重复的值,而且我的表中没有键。我的问题是:这个查询需要很多时间来插入新值。我正在尝试插入 1000000 行。
我有哪些选择?
非常感谢!
【问题讨论】:
-
我相信将
Not Exists子句中的 select 替换为SELECT 'x' From...会更好一些,因为一旦找到第一个匹配项就会转储。 -
@John_Rodgers - 你真的想使用 LIKE 进行比较吗?您是在寻找完全匹配还是类似匹配?尤其是像“class_id”这样的东西。
-
字段 [student_name],[class_id],[contact_detail],[birth_date] 是我表的业务键。这就是为什么我把所有的比较
-
@John_Rodgers - 这是有道理的,我只是质疑使用 LIKE 与 equals 进行优化。换句话说,只有在真正需要时才使用 LIKE。
标签: sql-server tsql staging-table