如何在sql上删除第一个SELECT?

时间:2014-12-22 15:37:35

标签: sql sql-server sql-server-2012

我想只删除我在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)

3 个答案:

答案 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表。你也可以避免这种情况!如果FechaHora实际上来自您要删除的行,则可以执行以下操作:

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的良好习惯(而不仅仅是tFichajesdbo.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)