2013-10-09 3 views
1

Я пытаюсь выбрать первый результат из инструкции select в инструкции набора обновления. Я могу выбрать верхнюю 1, но порядок заказа не работает. Есть ли способ заставить его работать или обходным путем?Порядок заказа в наборе Заявление об обновлении

UPDATE a1 
SET  a1.ServiceLength = (SELECT TOP 1 
            a3.START_DATE 
            ORDER BY a3.START_DATE DESC 
         ) 
FROM #t a1 
    JOIN #TempService a2 ON a1.EmployeeNo = a2.EMPLOYEE_NO 
    JOIN #TempService a3 ON a3.EMPLOYEE_NO = a2.Employee_No 
WHERE a2.START_DATE = a3.END_DATE + 1 
    AND @specifiedDate > a2.START_DATE 

ответ

2

Попробуйте сделать это с помощью КТР:

WITH TopDate 
AS 
(
    SELECT TOP 1 a3.START_DATE, a3.employee_no 
    FROM #t a1 
    JOIN #tempservice a2 ON a1.employeeno = a2.employee_no 
    JOIN #tempservice a3 ON a3.employee_no = a2.employee_no 
    WHERE a2.start_date = a3.end_date + 1 
     AND @specifiedDate > a2.start_date 
    ORDER BY a3.START_DATE DESC 
) 
UPDATE a1 
SET a1.ServiceLength = t.START_DATE 
FROM #t a1 
INNER JOIN TopDate AS t ON a1.employeeno = t.employee_no 
+0

Я скопировал точный sql, который вы предоставили, и это вызывает у меня следующую ошибку: Неправильный синтаксис рядом с ключевым словом 'with'. Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен быть прерван точкой с запятой. – Baahubali

+0

@ user1490835 - Try'; WITH TopDate ... 'также какую версию сервера sql вы используете? Это должно отлично работать для SQL Server 2005 + –

+0

Спасибо Mate. С помощью нескольких обходных решений я получил работу так, как мне хотелось. Спасибо за вашу помощь снова. Приветствия. – Baahubali

0

Что-то вроде этого ...:

UPDATE a1 
SET a1.servicelength = a3.start_date       
FROM #t a1 
     JOIN #tempservice a2 
     ON a1.employeeno = a2.employee_no 
     JOIN (SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_NO ORDER BY START_DATE DESC) AS rnk 
      FROM #tempservice) a3 
     ON a3.employee_no = a2.employee_no 
     AND a3.rnk = 1  
WHERE a2.start_date = a3.end_date + 1 
     AND @specifiedDate > a2.start_date 
+0

Сначала он говорит о некорректном синтаксисе рядом с *, когда я удаляю *, он говорит о некорректном синтаксисе рядом с над? – Baahubali

1

Вы можете использовать MAX (START_DATE), чтобы получить последнюю START_DATE для каждого сотрудник

update A set A.ServiceLength= (select MAX(B.Start_Date) from #tbl1 B where B.EmployeeNo=A.EmployeeNo) 
from #tbl1 A 

Пожалуйста, добавьте необходимые условия, ур.

+0

Это и ответ от Махмуда помогли мне добраться туда, где я хотел. Благодарю. – Baahubali

+0

Всегда здесь, чтобы помочь:) .... – vinbhai4u

Смежные вопросы