2014-12-22 2 views
0

Я хочу удалить только первое вхождение, которое я нахожу с моим предложением. Я объясняю это лучше, у меня есть 4 даты:Как удалить firts SELECT на sql?

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) 
+1

Ну, если вы запустили только оператор SELECT из SQL, что он возвращает? – OldProgrammer

+0

он возвращает только IdTrabajador, теперь я понимаю проблему, но ... как я могу ее решить? Благодаря! :) – Imrik

+0

Но каковы ЗНАЧЕНИЯ? – OldProgrammer

ответ

0

если вы хотите только 1 запись удаления в одной попытке

и если ваш Select Query возвращает только 1 записи, то сделать что-то вроде этого

DELETE FROM tFichajes 
WHERE IdTrabajador = (SELECT TOP 1 IdTrabajador 
         FROM tFichajes 
         WHERE IdTrabajador='XXX' AND 
          IdCentro='XXX' 
         ORDER BY Fecha DESC, Hora DESC) 
+0

Я хочу удалить последнюю строку этого IdTrabajador, повторяю: проблема заключалась в том, что если у меня есть только IdTrabajador, «delete» стирает все строки этого IdTrabajador, и я хочу удалить только последнюю строку этого IdTrabajador, Я имею в виду ... Мне нужно вернуть что-то, что позволяет мне удалить только последнюю строку этого IdTrabajador. – Imrik

+0

. Исследуйте свой вопрос. Еще раз. Добавив иерархию таблиц и образцы данных, а также ваш вывод, если это возможно, добавьте SQLFIDDLE –

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) 
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 (;).