powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отобразить повторяющиеся строки
12 сообщений из 12, страница 1 из 1
Отобразить повторяющиеся строки
    #35364374
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загружается таблица (таблицы могут быть любые, с различными структурами)
Мне нужно отобразить строки, в которых повторяются все значения полей.
Как бы это сделать, желательно с помощью SQL?
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35364451
ВалерийК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет
select naimen,;
ves,;
cena,;
count(naimen) as kol;
from tabl1;
group by naimen,ves,cena;
into cursor ttt nofilter

Там где kol>1 - повторяющиеся

Дальше обрабатывай курсор
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35364469
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально мне не известно какая таблица будет загружена и какие будут поля
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35364473
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
select f1, f2 ... from MyTable group by f1, f2 ... having count(*) >  1  into cursor tdouble

Запрос генеришь программно, AFIELDS() - список полей
и запускаешь через макроподстановку.

Второй вариант - считаешь хэш (MD5 например) каждой записи, пишешь в отдельный курсор recno() обрабатываемой записи и хэш.
Дальше по хэшу такой же селект и в обратную сторону по номерам выбранных записей
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35364547
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
select f1, f2 ... from MyTable group by f1, f2 ... having count(*) >  1  into cursor tdouble

Запрос генеришь программно, AFIELDS() - список полей
и запускаешь через макроподстановку.


Точно. Спасибо.
А не подскажите ли как я теперь эти строки могу удалить?
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35364643
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemansА не подскажите ли как я теперь эти строки могу удалить?

генери
Код: plaintext
delete for F1 = '...' and F2 = '...' and ...

Так медленно очень будет удалять, если надо удаление, то проще по варианту с хэшами делать.

Задача то какая изначально? Или ты хочешь по шагам спрашивать?

Если надо получить таблицу без задвоений, т.е. задвоившиеся записи в одном экземпляре, то так:
Код: plaintext
select distinct * from MyTable into cursor tuniq

Для проверки есть ли задвоения можно кол-во записей сравнивать:
Код: plaintext
1.
2.
3.
4.
sele MyTable
count to lnCount && для пропуска помеченных на удаление
if lnCount != reccount('tuniq')
   ? 'Есть задвоения'
endif
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35365020
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
генери
Код: plaintext
delete for F1 = '...' and F2 = '...' and ...

Так медленно очень будет удалять, если надо удаление, то проще по варианту с хэшами делать.

Задача то какая изначально? Или ты хочешь по шагам спрашивать?

Если надо получить таблицу без задвоений, т.е. задвоившиеся записи в одном экземпляре, то так:
Код: plaintext
select distinct * from MyTable into cursor tuniq

Для проверки есть ли задвоения можно кол-во записей сравнивать:
Код: plaintext
1.
2.
3.
4.
sele MyTable
count to lnCount && для пропуска помеченных на удаление
if lnCount != reccount('tuniq')
   ? 'Есть задвоения'
endif


Задача так и стоит: сначала отобразить, а потом, при необходимости, удалить.

А с хэшами я вообще ничего не понял :)
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35365114
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemansА с хэшами я вообще ничего не понял :)
Делаешь курсор THASH (nRecno i, cMD5 c(32))
заполняешь nRecno - номер записи в исходной таблице Recno(), cMD5 - MD5() от записи преобразованной в строку. Преобразовать можно через SCATTER и разбор массива для каждой записи.
Затем работаешь с курсором. Для одинаковых записей хэш будет одинаковый. По хэшу в курсоре просто найти номер записи в исходной таблице.

Тут недавно похожую ситуацию обсуждали, про хэши спорили.
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35365945
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дим, а есть смысл просчитывать хэш?

Мне кажется с просчитыванием хэша, во первых, гораздо больше заморочек, во
вторых, время на просчитывание хэша будет уходить немаленькое. В данной
ситуации простого Group by ... having ... со всеми полями хватит заглаза


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35366060
scelo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
делаю так: делаю копию файла - потом помечаю двойников- потом удаляю
**delete dvoinikov
CLOSE TABLES
*USE d:\eias_iz\kvp
SET DEFAULT TO d:\dub\

COPY FILE d:\eias_iz\kvp.dbf TO pervac.dbf
COPY FILE d:\eias_iz\kvp.dbf TO drugac.dbf

USE pervac IN 1
SELECT 1
DELETE TAG all
INDEX on column3 TAG column3
USE drugac IN 2
SELECT 2
DELETE TAG all
INDEX on column3 TAG column3
SELECT 1
DELETE TAG all
INDEX on column3 TAG column3

UPDATE ON column3 FROM drugac REPLACE Column13 WITH 'e'

CLOSE TABLES
USE pervac
DELETE FOR pervac.column13 <> 'e'
PACK
BROWSE
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35367656
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat
Дим, а есть смысл просчитывать хэш?

Если можно без макроподстановок, то лучше без них. Читабельнее код будет. Структура таблицы ведь заранее неизвестна.

Если надо после удалять - то проще иметь хотя бы порядковые номера удаляемых записей, чем городить условие отбора по значению:
Код: plaintext
delete for F1 = '...' and F2 = '...' and ...
А что касается скорости - для маленьких таблиц это не принципиально, а для больших select ... having плюс десяток удалений может дольше получится чем отдельный индексированный курсор с хэшами и GO по номеру записи.
...
Рейтинг: 0 / 0
Отобразить повторяющиеся строки
    #35367683
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл еще добавить - всегда лучше все тяжелые операции собрать воедино, т.е. юзер знает что он чего-то запустит, оно долго посчитает, а потом он быстро все закончит. Он запустит и чем-нибудь еще позанимается пока комп молотит.
А если перемешивать действия пользователя и тяжелые операции (delete for ... по большой таблице например) то юзеру и не отойти и быстро не сделать, вот он и будет сидеть и матерится про себя на разработчика ожидая ответа на очередную нажатую кнопку.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отобразить повторяющиеся строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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