2010-05-17 5 views
29

Я пытаюсь выполнить это на MS-SQL, но возвращает мне ошибку только в группе по линиигруппа SQL Server Update по

update #temp 
Set Dos=Count(1) 
From Temp_Table2010 s 
where Id=s.Total and s.total in (Select Id from #temp) 
group by s.Total 

ли кто-нибудь знает, как я могу решить эту проблему, имеющую хорошую производительность.

+0

Опишите, что вы пытаетесь здесь сделать. Я попытаюсь помочь вам переписать запрос, но я не могу понять, что вы пытаетесь выполнить. Поскольку имена таблиц не имеют смысла, возможно, вы можете, по крайней мере, предоставить список столбцов в каждом и образец данных, на которые вы смотрите. – SqlRyan

ответ

11

Вы не можете использовать агрегат в запросе UPDATE для стартеров - хотя вы не указали сообщение об ошибке в исходном вопросе, я подозреваю, что это то, что он вам говорит.

Вам нужно будет рассчитать агрегат перед обновлением и сохранить результаты в таблице temp, а затем присоединиться к этой таблице, чтобы выполнить обновление.

48

Попробуйте

;with counts 
AS 
( 
    SELECT total, COUNT(*) as dos 
    FROM temp_table2010 
    WHERE total in (select id from #temp) 
) 
UPDATE T 
SET dos=counts.dos 
FROM #temp T 
INNER JOIN counts 
    ON t.id = counts.total 
+3

это называется использованием общего представления таблицы (или CTE.), Некоторые документы - https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx и https: // msdn.microsoft.com/en-us/library/ms175972.aspx – mmcrae

+0

Что такое точка с запятой в начале '; с counts', это служит цели, отличной от закрытия предыдущего оператора? – Splatmistro

+0

«with» означает что-то еще, когда это не начало утверждения. Точки с запятой являются необязательными в T-sql, поэтому синтаксический анализатор должен определить, куда должны идти точки с запятой. Если есть предложение select, непосредственно предшествовавшее CTE, это противоречит парсеру, если он является частью предыдущего заявления или является его собственным. ведущая точка с запятой делает это явным. Он был принят в качестве конвенции для предотвращения любых вопросов синтаксического анализа. –

14

В SQL Server вы можете сделать агрегацию в запросе обновления вы просто должны сделать это в подзапрос, а затем присоединиться к нему на стол вы хотите обновить.

UPDATE #temp 
SET  Dos = Cnt 
FROM #temp 
    INNER JOIN (SELECT Total, COUNT(*) AS Cnt FROM Temp_Table2010 GROUP BY Total) AS s 
     ON Id = s.Total 

Делать это:

WHERE total in (select id from #temp) 

И потом:

INNER JOIN counts 
    ON t.id = counts.total 

избыточен.

Объединение решает требование «всего в (...)». Группируйте по ключу, а затем присоединитесь.