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

Не могу никак запустить правильный цикл.
Задача такая, есть две таблицы (допустим 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
03.08.2006, 12:10
    #33896781
AlikWishin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
Направление?!

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

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

А если про пример, то у меня в одной таблице все поля строковые, в другой числовые и DateTime.
...
Рейтинг: 0 / 0
03.08.2006, 13:57
    #33897205
AlikWishin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
Код: 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
03.08.2006, 14:44
    #33897415
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
Вы привели все поля таблиц?
Или все-таки есть первичные ключи?

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

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

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

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

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

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


AlikWishin

А, все, нашел...
Дело в том, что у нас все пользуют 6 FOX, а там этой функции нет. Я себе поставил сейчас 8, в которой INDEXSEEK() уже есть.
А что, есть большая разница между этими функциями? Нужно ведь чтобы она возвращала данные с найденного поля, а без перехода на это поле никак?
...
Рейтинг: 0 / 0
07.08.2006, 16:10
    #33903520
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
Пусть в таблицах есть уникальные идентификаторы строк (Первичные ключи - 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
07.08.2006, 18:08
    #33903914
AlikWishin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
kruzz
...
AlikWishin

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

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

Код: 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
08.08.2006, 14:56
    #33905662
kruzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cравнение двух таблиц...
Aleksey-K , спасибо!
Буду пытаться.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cравнение двух таблиц... / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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