sql-server - 更新查询需要更多时间
问题描述
更新查询需要更多时间。没有TOP 1,有没有其他方法可以写下面的查询?喜欢使用排名或行号功能?
SELECT proddiv,
prodstl,
prodcode,
lablcode,
proddim,
proddiv AS PRD_DIV,
prodstl AS PRD_PRODSTL,
prodcode AS PRDCOLOR,
label_code AS PRDlbl,
proddim AS par_dim,
0 AS low_level,
0 AS smuh_pkey,
IDENTITY(int) AS prdkey,
list_price
INTO #brandsdata
FROM products WITH (nolock)
DECLARE @Max INT = 30,
@x INT = 0
WHILE ( @x < 30 )
BEGIN
UPDATE t
SET smuh_pkey = (SELECT TOP 1 prdkey
FROM customers WITH (nolock)
WHERE ( proddiv = ''
OR proddiv = t.proddiv )
AND ( prodstl = ''
OR prodstl = t.prodstl )
AND ( prodcode = ''
OR prodcode = t.prodcode )
AND ( lablcode = ''
OR lablcode = t.lablcode )
AND ( proddim = ''
OR proddim = t.proddim )
AND prod_type = ''
AND active_ok = 'Y'
ORDER BY brand_name,
brand_type DESC)
FROM #brandsdata t
WHERE smuh_pkey = 0
AND low_level = @x
SET @x = @x + 1
END
提前致谢。
解决方案
尝试这样的事情。
;with c as (
select c.prdKey, c.proddiv, c.prodstl, c.prodcode, c.lablcode, c.proddim,
ROW_NUMBER() over (
partition by c.proddiv, c.prodstl, c.prodcode, c.lablcode, c.proddim
order by c.brand_name, c.brand_type DESC) rn
from customers c
where prod_type = '' and
active_ok = 'Y'
)
update t
set smuh_pkey = c.prdKey
from #brandsdata t
inner join c
on ( c.proddiv = '' OR c.proddiv = t.proddiv )
AND ( c.prodstl = '' OR c.prodstl = t.prodstl )
AND ( c.prodcode = '' OR c.prodcode = t.prodcode )
AND ( c.lablcode = '' OR c.lablcode = t.lablcode )
AND ( c.proddim = '' OR c.proddim = t.proddim )
where c.rn = 1
我认为这对于 100% 的情况来说是不够的,因为如果你可以有多个空字符串和非空字符串的组合,你可能会得到不同的结果。然后你可以微调
推荐阅读
- vba - 经典的 asp 布尔到字符串语言
- macos - 如何使用原生 API 在 MacOS 上获取设备像素比?
- c# - Web api 代码 - 加载失败 - 访问控制允许来源
- react-native - 通常在通过socket.io发送imagedata时断开连接
- x86 - 32 位与 64 位系统 - 内存限制是位还是字节?
- python - 绘图中x轴上的时间
- arrays - MongoDB 数组数据删除
- asp.net - IIS Web.config 重定向到子域的查询
- vb.net - VS2017中的VB.Net函数重载解决问题
- html - 如何使用 CSS 更改 SVG 的高度宽度?