Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как удалить с таблицы повторяющееся записи??  [new]
TarasV
Member

Откуда:
Сообщений: 30
Как удалить с таблицы повторяющееся записи(в одном поле)??
Но оставиль одну запись - любую.
6 окт 04, 18:24    [1014110]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
leaf
Member [заблокирован]

Откуда: Ростов-на-Дону --> Москва
Сообщений: 2661
use d:\t1 in 0
select * from t1 into curs qq1 group by field1
use in t1
select qq1
copy to d:\t1.dbf
6 окт 04, 18:29    [1014120]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
SergeyPl
Member

Откуда: Харьков
Сообщений: 287
leaf
use d:\t1 in 0
select * from t1 into curs qq1 group by field1
use in t1
select qq1
copy to d:\t1.dbf

Грубо и не правильно, даже не работает!
6 окт 04, 19:15    [1014205]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
TarasV
Member

Откуда:
Сообщений: 30
SergeyPl
leaf
use d:\t1 in 0
select * from t1 into curs qq1 group by field1
use in t1
select qq1
copy to d:\t1.dbf

Грубо и не правильно, даже не работает!


Согласен!!!
6 окт 04, 19:22    [1014224]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
TarasV
Member

Откуда:
Сообщений: 30
Таблица
ID name
1 n1
2 n2
2 n22
2 n222
3 n3

Надо оставить только одну запись с ID=2 и любим name
6 окт 04, 19:26    [1014234]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
SergeyPl
Member

Откуда: Харьков
Сообщений: 287
См. форум MS SQL Server и благодарим тех, кто там отвечает!
К сожалению, VFP не поддерживает удаление по запросу.
Вариант без сохранения уникального кода (: для таблицы с первичным ключом:
use t_test in 0
SELECT * FROM t_test ;
   INTO CURSOR Cur1 ;
   WHERE f_id in (select min(f_id) as f_id ;
                        from t_test ;
                        group by f_name having count(f_id)>1)

select t_test
zap
INSERT INTO t_test (f_name,f_pfone) ;
         SELECT f_name,f_pfone FROM cur1
6 окт 04, 21:37    [1014369]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
SergeyPl
Member

Откуда: Харьков
Сообщений: 287
TarasV
Таблица
ID name
1 n1
2 n2
2 n22
2 n222
3 n3

Надо оставить только одну запись с ID=2 и любим name


Для этого варианта:

use t_test in 0
SELECT * FROM t_test ;
   INTO CURSOR Cur1 ;
   WHERE id in (select min(id) as id ;
                        from t_test ;
                        group by name having count(id)>1)

select t_test
zap
INSERT INTO t_test (id,name) ;
         SELECT id,name FROM cur1
Для таблицы спервичным ключом придется организовать более сложную обработку...
6 окт 04, 21:43    [1014371]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
SergeyPl

К сожалению, VFP не поддерживает удаление по запросу.


Простите за глупый вопрос - А Вы сами то пробовали?

Так - как версия не указана то открою Вам секрет - с 8 версии это уже поддерживается, а в 9 сняты уже многие ограничения...

Например:

DELETE FROM tmp.dbf WHERE codeco in (select codeco FROM tmp.dbf WHERE codeco='A')

уже работает
6 окт 04, 23:32    [1014427]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
leaf
Member [заблокирован]

Откуда: Ростов-на-Дону --> Москва
Сообщений: 2661
Грубо и не правильно, даже не работает!
у меня запрос из Вашей тестовой таблицы выбрал
1 n1
2 n222
3 n3

те любое значение
где не работает ?
считали зарплату было куча записей двойных всё время так делали и всё до копейки сходилось
так где грабли?
7 окт 04, 09:29    [1014784]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Внимательно следите за руками

1) Использование индекса типа UNIQUE

select MyTab
DELETE ALL
SET DELETED OFF
INDEX ON MyField TO idxUnique UNIQUE COMPACT
RECALL ALL
SET INDEX TO
DELETE FILE idxUnique.idx

2) Если ЕСТЬ индекс по нужному полю

SET DELETED ON
LOCAL lvPrevValue
select MyTab
SET ORDER TO MyField
GO TOP
SCAN
	lvPrevValue = MyTab.MyField
	SKIP
	DELETE WHILE MyTab.MyField=m.lvPrevValue
	SKIP -1
ENDSCAN

3) Если НЕТ индекса по нужному полю

SET DELETED ON
LOCAL lvPrevValue, lnRecno
select MyTab
SET ORDER TO 0
GO TOP
SCAN
	lvPrevValue = MyTab.MyField
	lnRecno = Recno()
	DELETE FOR MyTab.MyField=m.lvPrevValue AND Recno()<>m.lnRecno
	GO m.lnRecno
ENDSCAN
7 окт 04, 09:37    [1014813]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить с таблицы повторяющееся записи??  [new]
SergeyPl
Member

Откуда: Харьков
Сообщений: 287
TO Sergey Ch !!!
Признаю! В 8 работает !!! :)

Тогда совсем красиво:

SELECT * FROM t_test ;
   INTO CURSOR Cur1 ;
   WHERE f_id in (select min(F_ID) as F_ID ;
      from t_test group by F_NAME having count(F_ID)>1)

DELETE FROM t_test WHERE f_id NOT IN (SELECT f_id FROM cur1)
7 окт 04, 10:36    [1015074]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить