2014-11-04 62 views
0

內UPDATE獲取從Table去年創建的所有領域,但只有那些,對於每一個不同的Field加入SELECT阻擋WHILE循環

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循環中這個數據。最後,我嘗試更新同一張表 - 同一個記錄讀取 - 它給了我一個超時。我認爲它是因爲表格被阻止進行更改。

我的問題是:如何解決它?任何方式來'修復'的查詢,以便它會接受更新?

額外信息:如果我查詢沒有加入它完美的作品。

+0

什麼數據庫引擎正在處理? – 2014-11-04 19:35:27

+0

@Andrei SQL Server – 2014-11-05 12:22:25

回答

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 
+0

事情是我需要一些來自'SELECT'的數據用於其他表中的其他操作。 – 2014-11-05 12:21:36

+0

然後考慮將您的查詢結果放在臨時表或表格類型變量中。那麼你可以在多個地方使用它。另外,考慮接受答案,如果它有幫助。 – Rahul 2014-11-05 12:34:18

+0

我想做這樣的事情,但我改變了一點點的代碼。雖然它不是我用來解決這個問題,但我想將它標記爲答案。 – 2014-11-05 16:16:35