Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как правильно удалить / 7 сообщений из 7, страница 1 из 1
13.10.2004, 00:36
    #32735181
ГЕОРГИЙ18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
здравствуйте
вопрос такой:
как правильно удалить мне записи которые повторяютя сразу в трех полях
т.е. есть база plat.dbf с полями fam c(20), name c(10), otch c(15), sum_pl c(10,2), mes n(2), god c(4)
мне нужно удалить записи которые встречаются больше одного раза
ПРИМЕР если в полях nam c(20), name c(10), otch c(15) с значением
nam , name , otch
ИВАНОВ ИВАН ИВАНОВИЧ
встречается запись
nam , name , otch
ИВАНОВ ИВАН ИВАНОВИЧ
или
nam , name , otch
ИВАНОВ ПЕТР ИВАНОВИЧ
то
ИВАНОВ ИВАН ИВАНОВИЧ удалить обоих
а оставить только
ИВАНОВ ПЕТР ИВАНОВИЧ

ВООБЩЕ ТО ЭТО КОМАНДА
SELECT fam, name, otch, COUNT(*) FROM plat GROUP BY 1,2,3 HAVING COUNT(*)>1
МНЕ ВЫВОДИТ ТАК НАЗЫВАЕМЫХ ДВОЙНИКОВ, НО КАК ИХ УДАЛИТЬ
...
Рейтинг: 0 / 0
13.10.2004, 07:23
    #32735253
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
ГЕОРГИЙ18здравствуйте
вопрос такой:
как правильно удалить мне записи которые повторяютя сразу в трех полях
мне нужно удалить записи которые встречаются больше одного раза
ВООБЩЕ ТО... КОМАНДА
SELECT fam, name, otch, COUNT(*) FROM plat GROUP BY 1,2,3 HAVING COUNT(*)>1
МНЕ ВЫВОДИТ ТАК НАЗЫВАЕМЫХ ДВОЙНИКОВ, НО КАК ИХ УДАЛИТЬ

А дальше все просто:
ВАРИАНТ 1:
Внешний цикл:
Код: plaintext
1.
2.
3.
4.
5.
SELECT QUERY &&Или другой курсор, куда ложатся "Двойники"
GO TOP
SCAN
  <здесь будет внутренний цикл>
ENDSCAN

Внутренний цикл:
Код: plaintext
1.
2.
3.
4.
  SELECT PLAT
  GO TOP
  DELETE FOR fam=QUERY.FAM AND name=QUERY.NAME AND otch=QUERY.OTCH
  SELECT QUERY

ВАРИАНТ 2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
* Выбираем "двойников"
SELECT fam, name, otch, COUNT(*) FROM plat GROUP BY  1 , 2 , 3  HAVING COUNT(*)> 1  INTO CURSOR QUERY

* Выбираем всех, кроме "двойников"
SELECT A.* FROM plat A WHERE A.FAM+A.NAME+A.OTCH NOT IN (SELECT fam+ name+otch FROM QUERY) INTO TABLE QUERY1

* Очищаем всю (!) исходную таблицу
SELECT PLAT
DELETE ALL &&или ZAP, если таблица открыта в режиме EXCLUSIVE

*Наполняем таблицу "правильными" плательщиками
APPEND FROM QUERY1

ВАРИАНТ 3:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
* Выбираем "двойников"
SELECT fam, name, otch, COUNT(*) FROM plat GROUP BY  1 , 2 , 3  HAVING COUNT(*)> 1  INTO CURSOR QUERY

* Выбираем всех, кроме "двойников"
SELECT A.* FROM plat A WHERE A.FAM+A.NAME+A.OTCH NOT IN (SELECT fam+ name+otch FROM QUERY) INTO TABLE QUERY1

* Удаляем исходную таблицу
USE IN PLAT
ERASE PLAT.dbf 

*Переименовываем QUERY1 в PLAT
RUN RENAME QUERY1.DBF PLAT.DBF
ВАРИАНТ 3 работает в случае свободных таблиц или в FPD. Будет ли он работать в случае, если таблица включена в контейнер БД - не знаю. Надо пробовать...
...
Рейтинг: 0 / 0
13.10.2004, 10:38
    #32735544
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
Для начала, воспользоваться поиском по данному форуму

http://www.sql.ru/forum/actualthread.aspx?tid=128155
...
Рейтинг: 0 / 0
13.10.2004, 15:43
    #32736593
ГЕОРГИЙ18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
ВСЕ СПАСИБО
Станислав C.
2 ой вариант подгодит
...
Рейтинг: 0 / 0
14.10.2004, 02:44
    #32737331
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
DELETE FROM plat ;
WHERE EXISTS ;
(SELECT fam, name, otch ;
FROM plat ttt ;
WHERE ttt.fam == plat.fam AND ;
ttt.name == plat.name AND ;
ttt.otch == plat.otch ;
GROUP BY 1, 2, 3 ;
HAVING COUNT(*) > 1)

Версию фокса ты не указал, значит предполагаем наличие VFP8.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
14.10.2004, 11:17
    #32737791
ГЕОРГИЙ18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
Ваш вариант тоже правильный, но я не понял что означает команда "EXISTS"
в хелпе нет и в книгах я непойму, что означает команда.
спасибо
Igor Korolyov
...
Рейтинг: 0 / 0
14.10.2004, 11:35
    #32737851
AlikWishin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно удалить
ГЕОРГИЙ18Ваш вариант тоже правильный, но я не понял что означает команда "EXISTS"
в хелпе нет и в книгах я непойму, что означает команда.
спасибо
Igor Korolyov

EXISTS функцbя SQL. Говорит она о том, что есть ли выборка( в скобках) или нет,
Ну это типа
Select ... into table/cursor <Name>
А потом:
If RecCount(<Name>) == 0
Exit
Else
....
EndIf

Так вот EXISTS -> .T. Если RecCount()>0 и -> .F. Если RecCount()==0
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как правильно удалить / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]