SQL UPDATE 使用规则优化查询

标签 sql sql-server tsql sql-server-2008-r2

我有两个表FactLik(200万行)和UpdateStPrice(50万行)。 我需要使用规则更新 FactLik 表。

更新StPrice

| PRODUCTKEY | WAREHOUSEKEY | STARTDATE |  ENDDATE | PRIORITY | UNITPRICE |
---------------------------------------------------------------------------
|      36975 |            6 |  20120630 | 20121011 |        0 |       395 |
|      36975 |            6 |  20121018 | 20291231 |        0 |       371 |
|      36975 |            6 |  20121126 | 20121211 |      120 |       313 |
|      36975 |            6 |  20121126 | 20121219 |      120 |       288 |
|      36975 |            6 |  20121212 | 20291231 |      120 |       313 |

FactLik

|  TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY |  PRICE |
-------------------------------------------------------------------
| 20121205 |      36975 |              89 |            6 | (null) |

更新 FactLik 行的规则

  1. 对于相同的 ProductKeyWarehouseKeyUpdateStPrice 行中查找 Priority 为 MAX 且 FactLik。 TimeKey 位于 StartDateEndDate 之间。
  2. 现在找到 StartDate 为 MAX 的行。
  3. 现在找到 EndDate 为 MIN 的行。

来自 UpdateStPrice 的预期结果:

| PRODUCTKEY | WAREHOUSEKEY | STARTDATE |  ENDDATE | PRIORITY | UNITPRICE |
---------------------------------------------------------------------------
|      36975 |            6 |  20121126 | 20121211 |      120 |       313 |

结果FactLik:

|  TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY |  PRICE |
-------------------------------------------------------------------
| 20121205 |      36975 |              89 |            6 |    313 |

<强> SmallFiddle

BigFiddle

我有My QUERY这是非常慢的,实际上她慢跑了12个多小时。我在两个表上都有一些索引(建议执行计划),但它们根本没有帮助:)

因此,如果您能帮助我优化此查询,我将非常感激。

最佳答案

我认为您只需从 UpdateStPrice 订购数据即可做到这一点:

UPDATE factlik
SET price =
  (SELECT TOP 1 up.unitprice
   FROM updatestprice up
   WHERE up.productkey = factlik.productkey
   AND up.warehousekey = factlik.warehousekey
   AND factlik.timekey >= up.startdate
   AND factlik.timekey <= up.enddate
   ORDER BY priority desc, startdate desc, enddate 
)

sqlfiddle here

关于SQL UPDATE 使用规则优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978339/

相关文章:

mysql - 如何 SQL 一对多关系?

sql-server - 多个join条件都找不到记录如何返回NULL值

sql - 如何查找日期名称?

sql - TSQL 仅删除某些列上的重复行

php - 带连接的 SQL SELECT 可排除用户已回答的项目

php - MySQL中选择的时候需要用我的 'sql_real_escape_string'吗?

SQL Server 2016 Developer 版本无法连接到 (LocalDB)\MSSQLLocalDB

sql - 如何在 while 循环中多次存储到临时表中?

SQL 条件 where

sql - Oracle:如何在表中的 USER_TABLES.TABLE_NAME 上添加外键