Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление строки  [new]
VIT2708_
Guest
Подскажите как можна удалить 2 строки из 3 когда значения во всех колонках одинаковы. Когда переносил данные из внешней БД при обработке появились несколько строк с одинаковыми ID и все данные в колонках 1:1.

Запросом delete даже не знаю по какому условию удалять

Спасибо.
20 июл 16, 09:34    [19429794]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
VIT2708_,

https://www.google.com.ua/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=delete duplicate rows sql&oq=delete duplicata&aqs=chrome.2.69i57j0l5.10191j0j9
20 июл 16, 09:38    [19429818]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
VIT2708_
Guest
TaPaK,

Спасибо
20 июл 16, 09:47    [19429867]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY ID ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;
20 июл 16, 10:06    [19429964]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8832
delete top (2) from t1 where t1.id = 12345
20 июл 16, 13:25    [19430903]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8832
delete top (2) from t1 where t1.id = 12345
20 июл 16, 13:26    [19430906]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
delete top (2) from t1 where t1.id = 12345
А если надо удалить 3 из 4?
20 июл 16, 13:30    [19430924]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8832
iap
Владислав Колосов
delete top (2) from t1 where t1.id = 12345
А если надо удалить 3 из 4?


Чем вызван такой вопрос? Вы никогда 2-3 дубля в ручную не убирали из таблицы? Я показал простейший вариант.

автор
как можна удалить 2 строки из 3 когда значения во всех колонках одинаковы

Автору больше и не требуется.
20 июл 16, 13:45    [19431011]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
Автору больше и не требуется.
Формальная отписка! :))
20 июл 16, 13:55    [19431063]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
Владислав Колосов
Я показал простейший вариант.
Сначала найти все id с дублями, потом для каждого отдельно эти дубли удалять.
И в чем здесь простота?
20 июл 16, 14:00    [19431075]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
Владислав Колосов
Я показал простейший вариант.
Сначала найти все id с дублями, потом для каждого отдельно эти дубли удалять.
И в чем здесь простота?
В том, что найти надо глазами на экране!
20 июл 16, 14:02    [19431088]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
iap
invm
пропущено...
Сначала найти все id с дублями, потом для каждого отдельно эти дубли удалять.
И в чем здесь простота?
В том, что найти надо глазами на экране!
А если строк вдруг окажется не 3, а 2, то все, прощай данные!
20 июл 16, 23:23    [19433518]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8832
Вдруг метеорит упадет, что тогда? Вдруг в магазине соли не будет?
Инструмент должен соответствовать цели... Вы же не ходите везде с домкратом или разводным ключом. Просто упираетесь потому, что промахнулись с оптимальным ответом :)

И тут я задумался - а вдруг и правда всегда разводной при себе в барсетке?
21 июл 16, 11:21    [19435028]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
o-o
Guest
Владислав Колосов
а вдруг и правда всегда разводной при себе в барсетке?

ключ среди стеклотары? это негуманно
+
барсетка = бар в виде сетки, т.е. примерно вот так выглядит: Картинка с другого сайта.
борсетка происходит либо от французского boursette, либо от ит. borsetta.
соответствующие картинки можно найти, забив в гуглокартинки слово на языке оригинала
21 июл 16, 11:46    [19435240]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
Владислав Колосов,

вам знаком такое понятие, как "надежное программирование"? Так вот, ваш запрос крайне ненадежный, потому что зависит от дикого количества ручной работы: надо найти дубликаты глазами, посчитать их количество, верно скопировать ИД и это самое количество указать и не промахнуться. Нет никакой гарантии, что у ТС только одна порция дубликатов, нет даже никакой гарантии, что их действительно в этой порции 3. Так что ни один вменяемый разработчик вашим запросом для решения этой задачи пользоваться не станет: экономия секунд 5, а количество потенциального гемора зашкаливает.
21 июл 16, 13:24    [19436038]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Agapov_stas
Member

Откуда:
Сообщений: 402
iljy, капитан очевидность (с)
21 июл 16, 13:40    [19436220]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8832
В общем, меня не поняли, ну да ладно :) Каждый сам определяет адекватность инструмента поставленной задаче.
22 июл 16, 12:24    [19440736]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
Sergei A.
Member

Откуда:
Сообщений: 21
Глупый вопрос: почему в выражении
автор
;WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY ID ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;

ORDER BY делается по 1/0? Как это вообще работает?
22 авг 16, 13:48    [19573017]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Sergei A., если указана константа в ORDER BY, то такая операция не будет включаться в план выполнения. Аналогично ORDER BY (SELECT 1)
22 авг 16, 13:52    [19573038]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
o-o
Guest
AlanDenton
Sergei A., если указана константа в ORDER BY, то такая операция не будет включаться в план выполнения. Аналогично ORDER BY (SELECT 1)

аккуратнее надо выражаться.
если в order by ROW_NUMBER()-a указана константа, то вообще свалится еще на парсинге:
select row_number() over(order by null) -- by 'a'
from sys.all_columns;  

Msg 5309, Level 16, State 1, Line 2
Windowed functions do not support constants as ORDER BY clause expressions.
22 авг 16, 14:01    [19573080]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
o-o, виноват... Правы :) имел ввиду SELECT 1 и прочие варианты из этой оперы
22 авг 16, 14:20    [19573207]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
o-o
Guest
лучше наверное так:
как раз из-за того, что парсер отвергает константы в order by для windowed functions,
приходится извращаться.
можно вписать подзапрос, возвращающий скаляр,
можно функцию, т.е. парсер пропустит order by getdate(), @@error, @@version,...
но если просто число на число поделить (1/2), не сканает, ибо константа.
а вот результат деления на 0 ему снова нравится, т.к. уже НЕ константа
22 авг 16, 14:31    [19573290]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Sergei A.
ORDER BY делается по 1/0? Как это вообще работает?
Ответ прост: а чёрт его знает!
Тут главное слово - "работает".
22 авг 16, 16:35    [19574312]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить