在WHILE循环中加入了SELECT阻塞UPDATE

时间:2014-11-04 19:32:29

标签: c# sql timeout locking block

获取Table中的所有字段,但只显示最后创建的字段,每个字段Field

SELECT t1.* 
FROM Table AS t1 
INNER JOIN (
      SELECT Field
           , MAX(CreatedOn) AS MaxDate 
      FROM Table 
      WHERE ImportedOn IS NULL 
      AND Status <> 'error' 
      GROUP BY Field) AS t2 
ON t1.Field = t2.Field 
AND t1.CreatedOn = t2.MaxDate

我在while循环中读取了这些数据。最后,我尝试更新同一个表 - 读取相同的记录 - 它给了我一个超时。我认为它是因为表被阻止了变化。

我的问题是:如何解决这个问题?有什么方法可以“修复”查询,以便接受更新吗?

额外信息:如果我在没有JOIN的情况下进行查询,则效果非常好。

1 个答案:

答案 0 :(得分:2)

而不是在每次读取后逐行执行UPDATE;用表格做JOIN并更新。像下面的东西[样本;不是确切的查询]

UPDATE t1
SET column_name = tab.some_column_name
FROM Table t1
JOIN
(
SELECT t1.* 
FROM Table AS t1 
INNER JOIN (
SELECT Field, 
MAX(CreatedOn) AS MaxDate 
FROM Table 
WHERE ImportedOn IS NULL 
AND Status <> 'error' 
GROUP BY Field
) AS t2 
ON t1.Field = t2.Field 
AND t1.CreatedOn = t2.MaxDate
) tab 
ON t1.Field = tab.Field