Your solution содержит два почти идентичных подзапросов, которые только отличаются в возвращаемом столбце вывода. Если SQL Server поддерживается кортеж сравнения, вы могли бы объединить эти два подзапроса в один, как это:
DELETE FROM
tFichajes
WHERE
IdTrabajador='XXX'
AND IdCentro='XXX'
AND (Fecha, Hora) IN (
SELECT TOP 1
Fecha, Hora
FROM
tFichajes
WHERE
IdTrabajador='XXX'
AND IdCentro='XXX'
ORDER BY
Fecha DESC,
Hora DESC
)
;
Но даже если SQL Server не поддерживает этот синтаксис, вы можете избежать выполнения такой же запрос дважды, используя подзапрос выше в качестве производной таблицы и присоединение его к tFichajes
:
DELETE FROM
f
FROM
tFichajes AS f
INNER JOIN (
SELECT TOP 1
Fecha, Hora
FROM
tFichajes
WHERE
IdTrabajador='XXX'
AND IdCentro='XXX'
ORDER BY
Fecha DESC,
Hora DESC
) AS t1 ON f.Fecha = t1.Fecha AND f.Hora = t1.Hora
WHERE
f.IdTrabajador='XXX'
f.AND IdCentro='XXX'
;
Заметим, однако, что вы все еще ударять tFichajes
таблицу здесь дважды. Вы тоже можете этого избежать! Если Fecha
и Hora
на самом деле происходят из строки, которые вы хотите удалить, вы можете сделать просто:
WITH t1 AS (
SELECT TOP 1
Fecha, Hora
FROM
tFichajes
WHERE
IdTrabajador='XXX'
AND IdCentro='XXX'
ORDER BY
Fecha DESC,
Hora DESC
)
DELETE FROM
t1
;
Наконец, в качестве примечания, пожалуйста, рассмотреть вопрос о получении в хорошую привычку always specifying the schema (вместо просто tFichajes
записи dbo.tFichajes
или что бы ни была правильная схема в вашем случае), а также always ending SQL statements with a semicolon (;
).
Ну, если вы запустили только оператор SELECT из SQL, что он возвращает? – OldProgrammer
он возвращает только IdTrabajador, теперь я понимаю проблему, но ... как я могу ее решить? Благодаря! :) – Imrik
Но каковы ЗНАЧЕНИЯ? – OldProgrammer