我想只删除我在where where句子中找到的第一个事件。我解释得更好,我有4个约会:
Alba
Blanca
Carla
Diana
我想删除最后一个日期“Diana
”,但我删除了所有内容,我不知道为什么......我把我的SQL句子删除了:
DELETE FROM tFichajes
WHERE IdTrabajador IN (SELECT TOP 1 IdTrabajador
FROM tFichajes
WHERE IdTrabajador='XXX' AND
IdCentro='XXX'
ORDER BY Fecha DESC, Hora DESC)
答案 0 :(得分:1)
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(;
)。
答案 1 :(得分:0)
如果您只想在一次尝试中删除1条记录
如果您的选择查询仅返回1条记录 做这样的事
DELETE FROM tFichajes
WHERE IdTrabajador = (SELECT TOP 1 IdTrabajador
FROM tFichajes
WHERE IdTrabajador='XXX' AND
IdCentro='XXX'
ORDER BY Fecha DESC, Hora DESC)
答案 2 :(得分:0)
我解决了,问题是我只收到一个字段,我需要所有字段删除正确的行,所以我这样做:
DELETE
FROM tFichajes
WHERE IdTrabajador='XXX'
AND IdCentro='XXX'
AND Fecha IN (SELECT TOP 1 Fecha
FROM tFichajes
WHERE IdTrabajador='XXX'
AND IdCentro='XXX'
ORDER BY Fecha DESC, Hora DESC)
AND Hora IN (SELECT TOP 1 Hora
FROM tFichajes
WHERE IdTrabajador='XXX'
AND IdCentro='XXX'
ORDER BY Fecha DESC, Hora DESC)