Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-96371
Igorek
2003-09-08 16:01
2003.09.29
3 вопроса не флеймерам и не флудерам


1-96182
Vitaliygavrilov
2003-09-16 11:08
2003.09.29
На что нужно обратить внимание что сократить размер программы.


14-96386
Fitness
2003-09-11 12:49
2003.09.29
Вопрос по поводу пластиковых карт, стоит или нет?


1-96243
Berezne
2003-09-17 15:34
2003.09.29
Возможно ли произвести сортировку в DBGrid?


3-96153
Юлия
2003-09-07 19:02
2003.09.29
Вопрос по comboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский