我编写了一个程序,在不存在的情况下将数据添加到数据库(重复)。如果数据重复,则数据库中的空字段将被更新。
例如:第一次进入
js.executeScript("mobile: scrollTo", scrollObject);
现在,如果条目第二次带来一些额外的数据,那么
companyname email_id contact_name designation mobile fax country
1 abc xyz@abc.com xyz pqr
现在,现有数据仅针对空白字段进行更新,即仅在现有数据中更新移动传真和国家/地区。
现在我的更新查询如下:
2 abc xyz@abc.com xyz pqr 0987765 087722 South Africa
有时我会收到一条错误,上面写着“无法添加Timeout过期。在操作完成之前已超时或服务器没有响应”并通过sql profiler我知道上述查询的持续时间超过30秒。 此查询的执行时间超过30秒。如何优化查询,使执行时间少于30秒。
*注意上述查询是程序的一部分
答案 0 :(得分:0)
尝试使用merge
声明
MERGE INTO yourtable AS Target
USING (VALUES ('abc',
'xyz@abc.com',
'xyz',
'pqr',
0987765,
087722,
'South Africa')) AS Source (companyname, email_id, contact_name, designation, mobile, fax, country )
ON Target.companyname = Source.companyname
AND Target.email_id = Source.email_id
AND Target.contact_name = Source.contact_name
AND Target.designation = Source.designation
WHEN MATCHED THEN
UPDATE SET companyname = CASE WHEN target.companyname IS NULL OR target.companyname = '' THEN Source.companyname ELSE target.companyname END,
email_id = CASE WHEN target.email_id IS NULL OR target.email_id = '' THEN Source.email_id ELSE target.email_id END,
contact_name = CASE WHEN target.contact_name IS NULL OR target.contact_name = '' THEN Source.contact_name ELSE target.contact_name END,
designation = CASE WHEN target.designation IS NULL OR target.designation = '' THEN Source.designation ELSE target.designation END,
mobile = CASE WHEN target.mobile IS NULL OR target.mobile = '' THEN Source.designation ELSE target.mobile END,
fax = CASE WHEN target.fax IS NULL OR target.fax = '' THEN Source.fax ELSE target.fax END,
country = CASE WHEN target.country IS NULL OR target.country = '' THEN Source.country ELSE target.country END
WHEN NOT MATCHED BY TARGET THEN
INSERT (companyname,
email_id,
contact_name,
designation,
mobile,
fax,
country )
VALUES (companyname,
email_id,
contact_name,
designation,
mobile,
fax,
country );
注意:根据您的要求修改加入ON
条件
答案 1 :(得分:0)
好吧,这个查询似乎没有什么本质上的错误可以解释为什么这么长时间。我会查看查询计划,看看它在做什么。 我还会考虑缩进(为了便于阅读)并改进子查询(因为它看起来过于复杂)