Удаление только верхних рядов. SQL Server - PullRequest
2 голосов
/ 26 февраля 2010

Как мне удалить только верхнюю строку таблицы в SQL Server?

Я сделал:

set rowcount 1;
delete * from table;
set rowcount 0;

Но я не уверен, что это хороший способ сделать это.

Есть ли лучший способ сделать это?

Ответы [ 4 ]

6 голосов
/ 26 февраля 2010

ОБНОВЛЕНИЕ: упс! @gbn прав, мой образец ORDER BY был сломан! Обновление с правильным примером кода.

В наиболее распространенном случае, когда "top" основан на порядке значений в определенном столбце или столбцах, вы можете использовать CTE и ROW_NUMBER для имитации упорядоченного TOP:

WITH cte AS
(
  SELECT *, ROW_NUMBER() OVER(ORDER BY SomeColumn, OtherColumn) AS RowNum
  FROM table
)
DELETE FROM cte
WHERE RowNum <= 1;

См. статью Ицик Бэн-Гана по SQLMag в TOP для получения дополнительной информации об этом предлагаемом паттерне.

Если вы просто хотите удалить любую строку из набора дубликатов или просто по какой-то причине хотите удалить случайную строку, тогда можно опустить ORDER BY и сделать что-то попроще:

DELETE TOP (1) FROM table

Цитирование из УДАЛИТЬ документы на MSDN :

TOP (выражение) [PERCENT] Определяет количество или процент случайные строки, которые будут удалены. Выражение может быть числом или процентов строк. Строки ссылка в используемом выражении TOP с INSERT, UPDATE или DELETE не расположены в любом порядке.

Скобки, ограничивающие выражение в ТОП требуются во ВСТАВКА, ОБНОВЛЕНИЕ, и УДАЛИТЬ заявления. Для большего информацию см. TOP (Transact-SQL).

4 голосов
/ 26 февраля 2010
  • ТОП не имеет смысла без ЗАКАЗА ПО

  • Используйте WITH TIES, чтобы справиться с совместной вершиной

  • Вы не можете использовать ORDER BY непосредственно в DELETE, поэтому вы должны обойти это

Как это:

DELETE foo
FROM (SELECT TOP 1 /*WITH TIES*/ * FROM Mytable ORDER BY WhatDecidesTop) foo;

;WITH Foo AS
(
    SELECT TOP 1 /*WITH TIES*/ * FROM Mytable ORDER BY WhatDecidesTop
)
DELETE foo;
0 голосов
/ 14 октября 2014
Dim mySqlCommondDelete As String = "DELETE BOOK_ID,MemberID FROM (SELECT TOP 1 * FROM ISSUE_BOOK) where BOOK_ID = Val(" & deleteBook & ") and MemberID = Val(" & msk & ")"

Это работа для MS Access. Проверен sql.i ... удален только один первый необработанный файл ...

будет удалена только первая строка

0 голосов
/ 26 февраля 2010

Проблема с этим подходом состоит в том, что он будет случайным образом удалять одну строку, вам нужно быть более конкретным (например, использовать предложение order by), чтобы убедиться, что вы удаляете то, что хотите. Еще лучше - добавьте предложение where с первичным ключом для строки, которую вы действительно хотите удалить, и полностью удалите предложение "rowcount".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...