Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
McSimm2 (2003-09-08 13:29) [0]Есть возможность в запросе удалить повторяющиеся записи, причём не все, а одну оставить?
value1
value2
value1
value1
value3
На выходе
value1
value2
value3
← →
Vlad (2003-09-08 13:32) [1]Возможность есть.
в конце запроса написать GROUP BY <нужное_поле>
← →
Плохиш_ (2003-09-08 13:32) [2]distinct
← →
DenK_vrtz (2003-09-08 13:33) [3]физически удалить? уникальное поле есть? ТОлько одно значение повторяется или может быть сколько угодно повторяющихся?
← →
McSimm2 (2003-09-08 13:35) [4]Vlad © (08.09.03 13:32)
GROUP BY или тот же distinct мне выведет не повторяющиеся записи, а как мне физически удалить их ?
← →
McSimm2 (2003-09-08 13:35) [5]DenK_vrtz © (08.09.03 13:33) [3]
Уникального поля нет. Повторяющихся может быть сколь угодно много ... :(
← →
Vlad (2003-09-08 13:40) [6]А есть связка полей, которая может обеспечить уникальность записи ?
← →
McSimm2 (2003-09-08 13:43) [7]Да есть, впринципе можно попробовать в подзапросе сделать дистинкт, а через внешний запрос сделать привязку по этим полям. Как только потом удаление сделать ... что бы поле одно оставалось...
← →
Sandman25 (2003-09-08 13:43) [8]Если я правильно помню, в Oracle есть что-то типа RowNum - внутренний уникальный номер строки. Тогда можно удалить так:
delete from table
where rownum <>
(select min(rownum)
from table a
where a.field = table.field)
← →
DenK_vrtz (2003-09-08 13:44) [9]Маленькую процедуру написать и все, так как одним запросом может и не удастся
← →
McSimm2 (2003-09-08 13:55) [10]Sandman25 © (08.09.03 13:43) [8]
У меня таблица AAA, в ней поле FF,значения
1
2
1
3
1
подзапрос
select min(rownum)
from FF a
where a.field = a.field
возвращает 1 запись.
А весь запрос сообщает что ничего не удалено
delete from FF b
where rownum <>
(select min(rownum)
from FF a
where a.field = b.field)
← →
McSimm2 (2003-09-08 13:57) [11]Точнее вот так конечно
DELETE FROM aaa b
WHERE ROWNUM <> (SELECT MIN (ROWNUM)
FROM aaa a
WHERE a.ff = b.ff)
← →
Vlad (2003-09-08 13:59) [12]Это Sandman25 © пошутил так.
Ни в коем случае при удалении не пользуйся RowNum !!!
Видимо одним запросом сделать не получится.
← →
Reindeer Moss Eater (2003-09-08 14:01) [13]Используй ROWID и все получится даже в одном запросе
← →
Zacho (2003-09-08 14:01) [14]2 McSimm2 :
На будующее - никогда не создавай таблиц без первичных ключей, а то еще и не такие проблемы будут.
← →
Vlad (2003-09-08 14:02) [15]2 Reindeer Moss Eater © (08.09.03 14:01) [13]
Верняк говорит ! А я -то и забыл :)
← →
DenK_vrtz (2003-09-08 14:07) [16]Reindeer Moss Eater ©, запрос в студию! :-)
← →
McSimm2 (2003-09-08 14:07) [17]Reindeer Moss Eater © (08.09.03 14:01) [13]
А подробнне можно ?
Таблицу создавал не я ...
← →
Reindeer Moss Eater (2003-09-08 14:10) [18]Удалить записи из таблицы
где такие-то условия описанные выше и
где ROWID не равен максимальному ROWID из группы записей удовлетворяющих условию указанному выше
← →
Vlad (2003-09-08 14:29) [19]delete from table where rowid not in (select rowid from table group by нужные поля)
Удалит вааще все дубли.
← →
Vlad (2003-09-08 14:30) [20]сорри... where not (rowid in (select rowid from table group by нужные поля))
← →
McSimm2 (2003-09-08 14:37) [21]Vlad © (08.09.03 14:30) [20]
where not (rowid in (select rowid from table group by нужные поля))
Как можно сделать групировку по полям, а select - по rowid ???
RowId явно должно тоже в group by быть, что само по себе ерунда....
← →
Vlad (2003-09-08 14:40) [22]Ну да... погорячился. Вложенный селект нужен тогда.
Типа Select rowid from (запрос где Group by)
← →
McSimm2 (2003-09-08 14:45) [23]Vlad © (08.09.03 14:40) [22]
На запрос
DELETE FROM aaa
WHERE NOT (ROWID IN (SELECT rowid
FROM (select ff from aaa group by ff)
)
)
Выводит след. ошибку:
Нельзя выбрать RowID из представления, содержащего Distinct, Group By, и т.д.
← →
roottim (2003-09-08 15:14) [24]> Нельзя выбрать RowID из представления, содержащего Distinct, Group By, и т.д.
конечно нельзя!
можно это сделать и вложенным запросом. но если полей много, то лень будет их записывать :)
а что, стандартным методом нельзя, или связи сильно потеряются...
CREATE TABLE TMP1 AS SELECT * FROM MYTABLE;
DROP TABLE MYTABLE;
ALTER TABLE TMP1 RENAME TO MYTABLE
← →
roottim (2003-09-08 15:15) [25]> Нельзя выбрать RowID из представления, содержащего Distinct, Group By, и т.д.
конечно нельзя!
можно это сделать и вложенным запросом. но если полей много, то лень будет их записывать :)
а что, стандартным методом нельзя, или связи сильно потеряются...
CREATE TABLE TMP1 AS SELECT DISTINCT * FROM MYTABLE;
DROP TABLE MYTABLE;
ALTER TABLE TMP1 RENAME TO MYTABLE
← →
roottim (2003-09-08 15:15) [26]> Нельзя выбрать RowID из представления, содержащего Distinct, Group By, и т.д.
конечно нельзя!
можно это сделать и вложенным запросом. но если полей много, то лень будет их записывать :)
а что, стандартным методом нельзя, или связи сильно потеряются...
CREATE TABLE TMP1 AS SELECT DISTINCT * FROM MYTABLE;
DROP TABLE MYTABLE;
ALTER TABLE TMP1 RENAME TO MYTABLE
← →
Danilka (2003-09-08 15:24) [27]McSimm2 (08.09.03 14:45)
дык, группировка-же, надо вот-так:
DELETE FROM aaa
WHERE NOT (ROWID IN (SELECT max(rowid)
FROM (select ff from aaa group by ff)
)
)
и еще, был какой-то пример с minus, вроде шустрее на порядок.
← →
NickBat (2003-09-08 15:24) [28]А если так:
delete from test
where f1 in
(select f1
from test
group by f1
having count(f1)>1)
← →
Danilka (2003-09-08 15:33) [29]вобщем, вот-так работает. :))
DELETE FROM aaa
WHERE ROWID NOT IN (
SELECT MAX(ROWID)
FROM aaa
GROUP BY ff)
← →
McSimm2 (2003-09-08 15:39) [30]Danilka © (08.09.03 15:33) [29]
Точно !
Спасибо !
← →
Vlad (2003-09-08 15:40) [31]>Danilka © (08.09.03 15:33) [29]
Не приведи господь так удалять!
← →
andriy (2003-09-08 15:42) [32]А я бы создал процедуру, в котрой курсором бы прогнался по таблице. Но это я бы сделал...
:)
← →
Danilka (2003-09-08 15:45) [33]McSimm2 (08.09.03 15:39)
правда, если записей прилично, например около миллиона, а повторяющихся не очень много, то будут тормоза великие, список в секции IN(..) очень большой. Тогда имеет смысл вот-такой запрос:
DELETE FROM aaa
WHERE ROWID IN (
(SELECT ROWID
FROM aaa)
MINUS
(SELECT MAX(ROWID)
FROM aaa
GROUP BY ff))
← →
Danilka (2003-09-08 15:46) [34]Vlad © (08.09.03 15:40)
более полное утверждение, наверное вот-такое: "не приведи господь работать с таблицами без первичного ключа." :))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.04 c