Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.022 c
1-96179
qwerty2
2003-09-16 10:34
2003.09.29
PSafeArray и OleAutomation


3-96120
Beginer
2003-09-09 09:15
2003.09.29
Подскажите начинающему


1-96268
Armageddon
2003-09-16 11:43
2003.09.29
Как управлять перемещением мышки


14-96411
Саша2
2003-09-11 10:51
2003.09.29
мало файлов!


14-96452
KSergey
2003-09-10 08:18
2003.09.29
Про мушкетеров