powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cравнение двух таблиц...
14 сообщений из 14, страница 1 из 1
Cравнение двух таблиц...
    #33896650
kruzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите новичку! Как сделать сравнение двух таблиц?

Не могу никак запустить правильный цикл.
Задача такая, есть две таблицы (допустим A и B)нужно между ними сделать сравнение, и в таблице A оставить те записи которых нет в B, и наоборот в таблице B оставить то, чего нет в A.
Cравнение нужно проводить по трем полям одновременно, при этом время ±2 минуты считается нормой.

ПРИМЕР: название поля, тип данных, (длина строки)

| Таблица А |
|________________________________________________|
|нмр,С,(9) | врем_нач,C,(19) |нмр_2, С, (18) |
|_________|___________________|__________________|
|313852857|05.06.2006 15:28:33 |0070951273278 |
|_________|___________________|__________________|
|313861503|04.06.2006 13:20:22 |007333653320 |
|_________|___________________|__________________|
|313825789|06.06.2006 15:28:33 |0313242569 |
|----------|----------------------|---------------------|


| Таблица B |
|_______________________________________________|
|ном,N,(6) | врем_нач,T,(8) | ном2,C ,(17) |
|_________|___________________|_________________|
| 52438 |02.06.2006 15:27:45 |0073842540390 |
|_________|___________________|_________________|
| 21173 |02.06.2006 13:20:20 |0075932450124 |
|_________|___________________|_________________|
| 25789 |06.06.2006 15:27:42 |0313242569 |
|----------|----------------------|-------------------|

Больше буду рад не готовому решению, а направляющему совету.
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33896781
AlikWishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Направление?!

Ну предложу сосздать индекс по искомым(Сравниваемым) полям (У тя в примере все поля строковые?!)

Далее перебор одной с индексным поиском во второй если есть то удаляем, если нет то оставляем!
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33896864
kruzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таблицы обе проиндексированы.
Я пробовал примерно так
DO while !EOF()
SEEK...
и так далее, в общем, не получается правильно составить условие для SEEK.

А если про пример, то у меня в одной таблице все поля строковые, в другой числовые и DateTime.
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33897205
AlikWishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
do while !eof([таблица А])
   If IndexSeek(<Строка поиска>, .T., "Таблица В", <Tag индекса>)
      ... действия на удаление
   skip in таблица А
enddo

Строка индекса =
если поля символьные то поле1+поле2+поле3
если поля не символы то <Функция преобразования>(поле1)+<Функция преобразования>(поле2)+<Функция преобразования>(поле3)

Или же посморти Help по команде Delete
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Example
The following example opens the customer table in the testdata database. DELETE is used to mark all records for deletion where the country field contains USA. All the records marked for deletion are displayed. RECALL ALL is used to unmark all the records marked for deletion.
CLOSE DATABASES
OPEN DATABASE (HOME( 2 ) + 'Data\testdata')
USE customer  && Opens Customer table

DELETE FOR country = 'USA'  && Mark for deletion
CLEAR
LIST FIELDS company, country FOR DELETED( ) && List marked records
RECALL ALL  && Unmark all records marked for deletion
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33897415
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы привели все поля таблиц?
Или все-таки есть первичные ключи?

С уважением, Алексей
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33898464
BMJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMJ
Гость
А может собрать все в одну таблицу и убрать дубликаты по индексированию CANDIDATE
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33898820
kruzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to AlikWishin
пардон, а IndexSeek() что за функция?

to Aleksey-K
НЕт, не все поля привел есть еще, но это те, по которым нужно осуществить сверку

to BMJ
Тоже вариант. Только есть одна проблема, повторюсь, дело в том, что один и тот же звонок отображается в двух разных таблицах с разным временем , соответственно можно ли будет корректно удалить "дубликат"?
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33898852
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kruzzНЕт, не все поля привел есть еще, но это те, по которым нужно осуществить сверку

Так все-таки есть первичный ключ у таблиц? Если есть, то это сильно упрастит запрос.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33899745
AlikWishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kruzzto AlikWishin
пардон, а IndexSeek() что за функция?

да тоже самое что и Seek(), только с установкой идти к найденой записи или нет!
Посмотри Help.

И ответь на вопрос Aleksey-K
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33903208
kruzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K
Первичного индекса не было, но если нужно, сделаю. Хотя не очень понимаю что это =\ (Да поможет мне Справка!)


AlikWishin

А, все, нашел...
Дело в том, что у нас все пользуют 6 FOX, а там этой функции нет. Я себе поставил сейчас 8, в которой INDEXSEEK() уже есть.
А что, есть большая разница между этими функциями? Нужно ведь чтобы она возвращала данные с найденного поля, а без перехода на это поле никак?
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33903520
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть в таблицах есть уникальные идентификаторы строк (Первичные ключи - PK) и пусть PK генерятся с помощью свойства столбца AUTOINC (автоинкремент). Пусть они называются PK и имеют тип Integer.
Тогда можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
*--1. Формируем курсор - пересечение множеств (записи есть и в Table1 и в Table2)
SELECT T1.PK AS PK1, T2.PK AS PK2 
FROM Table1 T1  INNER JOIN Table2 T2 ON
T1.нмр = T2.нмр AND T1.нмр_2 = T2.нмр_2 AND ABS(T1.врем_нач - T2.врем_нач) <=  120 
INTO CURSOR Temp NOFILTER
*--2. Добавляем в Table1 записи с PK, которых нет в temp1
INSERT INTO Table1 (нмр, врем_нач,  нмр_2)
SELECT нмр, врем_нач,  нмр_2 
FROM Table2
WHERE PK NOT IN (SELECT PK2 FROM Temp)
*--3. Добавляем в Table2 записи с PK, которых нет в Temp
INSERT INTO Table2 (нмр, врем_нач,  нмр_2)
SELECT нмр, врем_нач,  нмр_2 
FROM Table1
WHERE PK NOT IN (SELECT PK1 FROM Temp)
С уважением, Алексей
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33903914
AlikWishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kruzz
...
AlikWishin

А, все, нашел...
Дело в том, что у нас все пользуют 6 FOX, а там этой функции нет. Я себе поставил сейчас 8, в которой INDEXSEEK() уже есть.
А что, есть большая разница между этими функциями? Нужно ведь чтобы она возвращала данные с найденного поля, а без перехода на это поле никак?
У меня VFP 6 SP3 Там IndexSeek() есть.

Принципиально разницы для твоей задачи не вижу(Просто дело привычки.
У меня задачи с выходом на найденую запись, поэтому и использую IndexSeek() )
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33904603
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если надо оставить только те записи, которых нет в другой таблице, то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
*--1. Формируем курсор - пересечение множеств (записи есть и в Table1 и в Table2)
SELECT T1.PK AS PK1, T2.PK AS PK2 
FROM Table1 T1  INNER JOIN Table2 T2 ON
T1.нмр = T2.нмр AND T1.нмр_2 = T2.нмр_2 AND ABS(T1.врем_нач - T2.врем_нач) <=  120 
INTO CURSOR Temp NOFILTER
*--2. Удаляем из Table1 записи с PK, которые есть  в temp
DELETE FROM Table1
WHERE PK IN (SELECT PK1 FROM Temp)
*--2. Удаляем из Table2 записи с PK, которые есть  в temp
DELETE FROM Table2
WHERE PK IN (SELECT PK2 FROM Temp)
С уважением, Алексей
...
Рейтинг: 0 / 0
Cравнение двух таблиц...
    #33905662
kruzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K , спасибо!
Буду пытаться.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cравнение двух таблиц...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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