Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
1

Удалить записи, кроме тех у которых минимальный id

04.07.2014, 09:42. Просмотров 967. Ответов 15
Метки нет (Все метки)

Есть таблица вида

oid | ObjectID | S | T

У одного ObjectID есть один либо несколько OID (значение в колонках S и T не столь важны, для данной задачи)

Задача заключается в том чтобы найти все ObjectID у которых количество OID больше одного и затем удалить все OID для данного ObjectID кроме самого минимального (все OID имеют вид - r+число, те r1234, r3456 и тд)

Т.е для всех ObjectID после запроса должен остаться минимальный OID из всех ранее принадлежащих им

Для примера ObjectID с идентификатором id0004 имеет 3 OID

oid | ObjectID | S | T
r007 id0004
r008 id0004
r013 id0004

после выполнения запроса должен остаться в данном случае только r007, аналогично для всех ObjectID у которых количество OID больше 1
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2014, 09:42
Ответы с готовыми решениями:

Выбрать все записи кроме первых и последних десяти
Каквыбрать все записи кроме первых 10 и последних 10?

Отобразить список тех объектов, координаты которых совпадают
Есть таблица, в которой содержатся данные по адресным объектам. В этой таблице...

Необходимо удалить из таблицы дубликаты name кроме тех у которых минимальный id
Добрый вечер, господа эскуэльщики! Не поможете помощь? Тут есть таблица...

Как из таблицы удалить все записи, кроме тех, где колонка middlename не пустая?
Привет! Подскажите пожалуйста,как из таблицы удалить все записи кроме тех где...

Выбрать все изображения, кроме тех у которых
Мне нужно выбрать из области класса .cards все картинки, у которых opacity!=1;...

15
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,310
04.07.2014, 10:10 2
T-SQL
1
2
3
4
5
6
7
8
with x as
(
 select
  row_number() over (partition by ObjectID order by cast(replace(oid, 'r', '') as int)) as rn
 from
  Таблица
)
delete from x where rn > 1;
1
Serpentariy
99 / 98 / 40
Регистрация: 09.07.2013
Сообщений: 195
04.07.2014, 10:10 3
T-SQL
1
2
;with cte as (select row_number() over (partition by  ObjectID order by oid) rn from [Есть таблица вида ])
delete cte where rn > 1
1
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 11:01  [ТС] 4
сейчас посмотрел есть OID у которых другая структура 234w244 к примеру, и возможно еще без удаления вариант, просто вывести все удовлетворяющие запросу

Добавлено через 7 минут
T-SQL
1
delete cte where rn > 1
удалит все строки с ObjectID у которых количество OID больше одного, а мне нужно чтоб одна строка из этой группы (с мин OID в группе все же осталась)

или я не правильно понял?

Добавлено через 11 минут
И возможно ли сделать данную задачу с помощью SQL а не T-SQL ?
0
iap
898 / 623 / 130
Регистрация: 27.11.2009
Сообщений: 1,863
04.07.2014, 11:20 5
Цитата Сообщение от fromdd Посмотреть сообщение
удалит все строки с ObjectID у которых количество OID больше одного, а мне нужно чтоб одна строка из этой группы (с мин OID в группе все же осталась)
или я не правильно понял?
Так ведь строки с rn=1 останутся!!
Цитата Сообщение от fromdd Посмотреть сообщение
И возможно ли сделать данную задачу с помощью SQL а не T-SQL ?
Соmmon Table Expression (CTE) - появился в стандарте ANSI SQL-1999
ROW_NUMBER()OVER() - в стандарте ANSI SQL-2003

Что Вы имеете в виду, говоря об SQL?
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 11:44  [ТС] 6
Вот что я имел ввиду под SQL
SQL
1
2
3
4
5
6
7
8
9
10
11
12
DELETE 
FROM LotPhisParameters 
WHERE ObjectID = (SELECT TOP 1 ObjectID
FROM LotPhisParameters
GROUP BY ObjectID
HAVING COUNT(*)>1)
AND  OID <> (SELECT MIN(SECOND.OID) FROM
LotPhisParameters SECOND
WHERE SECOND.ObjectID = (SELECT TOP 1 ObjectID
FROM LotPhisParameters
GROUP BY ObjectID
HAVING COUNT(*)>1))
только не знаю как цикл организовать теперь
0
iap
898 / 623 / 130
Регистрация: 27.11.2009
Сообщений: 1,863
04.07.2014, 11:50 7
Цитата Сообщение от fromdd Посмотреть сообщение
Вот что я имел ввиду под SQL
У Вас своё собственное представление о SQL?
А почему все об этом должны знать?

Цикл и SQL не могут иметь ничего общего.
Цикл - это как раз никакой не SQL!
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 11:59  [ТС] 8
Только изучаю, сильно не пинайте) Как организовать цикл с моим запросом?
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,310
04.07.2014, 12:23 9
Цитата Сообщение от fromdd Посмотреть сообщение
Только изучаю
Тем не менее, вы уже знаете как надо решать такие задачи и как не надо. Сильно...
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 13:15  [ТС] 10
Цитата Сообщение от invm Посмотреть сообщение
Тем не менее, вы уже знаете как надо решать такие задачи и как не надо. Сильно...
Я не говорю как надо и как не надо, я просто спросил возможен ли вариант без применения transact-SQL
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,310
04.07.2014, 13:28 11
Цитата Сообщение от fromdd Посмотреть сообщение
вариант без применения transact-SQL
Т.е. CTE - это T-SQL, а TOP 1 - нет?
Запросы, эффективно работающие на любой СУБД - утопия. Но если вы так желаете, то вот:
T-SQL
1
delete from Таблица where exists(select * from Таблица t where ObjectID = Таблица.ObjectID and t.oid < Таблица.oid);
0
iap
898 / 623 / 130
Регистрация: 27.11.2009
Сообщений: 1,863
04.07.2014, 13:30 12
Цитата Сообщение от fromdd Посмотреть сообщение
Я не говорю как надо и как не надо, я просто спросил возможен ли вариант без применения transact-SQL
Цикл WHILE - это как раз-таки Transact SQL!
То есть именно то, чего Вы не просили!
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 14:09  [ТС] 13
Я искренне рад что Вы все так тонко разбираетесь в SQL и в его стандартах, но может ли мне кто показать как мой запрос засунуть в цикл
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,310
04.07.2014, 15:15 14
Цитата Сообщение от fromdd Посмотреть сообщение
но может ли мне кто показать как мой запрос засунуть в цикл
Ваша цель научиться или любым способом забабахать цикл?
Если первое - изучайте показанные решения.
Если второе - реализовать без T-SQL не выйдет. И запрос ваш вообще не верен, ибо TOP без ORDER BY не гарантирует порядок записей, даже если это одинаковые подзапросы внутри одного запроса.
0
iap
898 / 623 / 130
Регистрация: 27.11.2009
Сообщений: 1,863
04.07.2014, 15:31 15
Цитата Сообщение от iap Посмотреть сообщение
Цикл WHILE - это как раз-таки Transact SQL!
Должен поправиться и извиниться.
Цикл WHILE таки есть в ANSI SQL-1999

Но всё равно к данной теме он отношения не имеет!
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
04.07.2014, 15:34  [ТС] 16
все всем спасибо буду разбираться
0
04.07.2014, 15:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2014, 15:34

Удалить из строки все слова, кроме тех, которые начинаются и оканчиваются на один и тот же символ
Дано - Задана строка, состоящая из слов, разделенных пробелами. Слово...

Удалить все записи, кроме десяти последних
Можно определить количество записей в таблице и затем подсчитать, сколько...

Удалить повторяющиеся записи, кроме одной из запроса MS Access
Давно не могу выполнить в Access такую простую для Excel задачу как &quot;Удалить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru