powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / сравнить две таблицы
9 сообщений из 9, страница 1 из 1
сравнить две таблицы
    #39915793
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

возникла необходимость сравнить две таблицы tb1 (f1, f2, f3) и tb2(f1, f2,f3)
поля у таблиц одинаковы, обе таблицы получены выборкой по полю f1 из других, и f1 не уникальный ключ . Некоторые записи в обоих совпадают, некоторые нет. Все поля численные.

примерно так:
tb1..............................tb2

f1..... f2......f3...... f1...... f2.....f3
1...... 5...... 15........1......5......15
1...... 2...... 7...... ..1...... 2......7
1...... 10......101......3......2...... 7
3...... 2...... 7.........3......10.....20
3...... 5...... 5.........3......5...... 5


Задача в том, что бы получить результирующую таблицу, в которой записи из каждой таблицы, которой нет в другой.

Текущее решение : получаю список f1 , он для обоих таблиц одинаков и может быть ключом, далее перебором суммирую произведения f2*f3 для каждого f1 в обоих таблицах sum(tb1.f2*tb1.f3) for tb1.f1 и sum(tb2.f2*tb2.f3) for tb2.f1 и получу таблицу tb3 по условию tb1.f1 = tb2.f1 and sum(tb1.f2*tb1.f3) != sum(tb2.f2*tb2.f3) for tb2.f1

Скан работает безумно долго, 66 000 + записей, есть ли иной какой-либо способ ?
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39915991
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
Здравствуйте!

возникла необходимость сравнить две таблицы tb1 (f1, f2, f3) и tb2(f1, f2,f3)
поля у таблиц одинаковы, обе таблицы получены выборкой по полю f1 из других, и f1 не уникальный ключ . Некоторые записи в обоих совпадают, некоторые нет. Все поля численные.

примерно так:
tb1..............................tb2

f1..... f2......f3...... f1...... f2.....f3
1...... 5...... 15........1......5......15
1...... 2...... 7...... ..1...... 2......7
1...... 10......101......3......2...... 7
3...... 2...... 7.........3......10.....20
3...... 5...... 5.........3......5...... 5


Задача в том, что бы получить результирующую таблицу, в которой записи из каждой таблицы, которой нет в другой.

Текущее решение : получаю список f1 , он для обоих таблиц одинаков и может быть ключом, далее перебором суммирую произведения f2*f3 для каждого f1 в обоих таблицах sum(tb1.f2*tb1.f3) for tb1.f1 и sum(tb2.f2*tb2.f3) for tb2.f1 и получу таблицу tb3 по условию tb1.f1 = tb2.f1 and sum(tb1.f2*tb1.f3) != sum(tb2.f2*tb2.f3) for tb2.f1

Скан работает безумно долго, 66 000 + записей, есть ли иной какой-либо способ ?


Если tb1 и tb2 это курсоры полученные, например из MSSQL, то задача сильно упрощается:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create table #t1 (f1 int, f2 int, f3 int)

insert into #t1 (f1, f2, f3) values(1,5,15), (1, 2,7), (1, 10, 101), (3, 2, 7), (3, 5, 5)


create table #t2 (f1 int, f2 int, f3 int)

insert into #t2 (f1, f2, f3) values(1,5,15), (1, 2,7), (3, 2, 7), (3, 10, 20), (3, 5, 5)
select * from #t2 


(
	select * from #t1
	union all
	select * from #t2
)
 EXCEPT
(
	select * from #t1
	INTERSECT
	select * from #t2
)
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916004
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это курсоры, полученные Select - sql в FoxPro 9, количество записей может не совпадать тоже.

Честно говоря, приведенный код не очень понятен.

create table #t1 (f1 int, f2 int, f3 int) - это имелось ввиду создать поля как Integer ?

и запрос не получается оформить.

select * == select all ?

да и сам запрос как-то не знакомо выглядит.

Не могли бы вы мне чуть подробнее пояснить ?
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916006
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create table #t1 (f1 int, f2 int, f3 int)
Создали табличку 1

insert into #t1 (f1, f2, f3) values(1,5,15), (1, 2,7), (1, 10, 101), (3, 2, 7), (3, 5, 5)
Заполнили тестовыми данными

create table #t2 (f1 int, f2 int, f3 int)
Создали табличку 2

insert into #t2 (f1, f2, f3) values(1,5,15), (1, 2,7), (3, 2, 7), (3, 10, 20), (3, 5, 5)
Заполнили тестовыми данными

Далее сравниваем
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=aps-pdw-2016
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916009
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183,

Спасибо за ссылку.
Однако легче мне не стало, SQL мне не знаком (

Интуитивно что-то понятно, что-то меньше, записать запрос из примера PaulWist не получается.

Нельзя ли как-то с привязкой к фоксу запрос показать?
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916027
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что-то у меня никак.
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916039
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
Ну что-то у меня никак.


На фоксе так.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
** временный курсор t1
create cursor t1 (f1 int, f2 int, f3 int)
** тестовые данные для первого курсора
insert into t1 (f1, f2, f3) values(1,5,15)
insert into t1 (f1, f2, f3) values(1, 2,7)
insert into t1 (f1, f2, f3) values(1, 10, 101)
insert into t1 (f1, f2, f3) values(3, 2, 7)
insert into t1 (f1, f2, f3) values(3, 5, 5)

** временный курсор t2
create cursor t2 (f1 int, f2 int, f3 int)
** тестовые данные для второго курсора
insert into t2 (f1, f2, f3) values(1,5,15)
insert into t2 (f1, f2, f3) values(1, 2,7)
insert into t2 (f1, f2, f3) values(3, 2, 7)
insert into t2 (f1, f2, f3) values(3, 10, 20)
insert into t2 (f1, f2, f3) values(3, 5, 5)

** идея простая, надо из первого курсора найти все записи, которые не существуют во втором
** и так же найти все записи из второго, которые не существуют в первом
** затем эти две выборки объединить

SELECT * FROM t1;
where NOT exists (SELECT 1 FROM t2 WHERE t2.f1 = t1.f1 AND t2.f2 = t1.f2 AND t2.f3 = t1.f3);
union;
select * FROM t2;
where NOT exists (SELECT 1 FROM t1 WHERE t2.f1 = t1.f1 AND t2.f2 = t1.f2 AND t2.f3 = t1.f3)
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916044
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist,

моя самая искренняя благодарность и уважение за оказанную помощь!

тестовые таблички работают, сейчас попробую просканировать всю базу
...
Рейтинг: 0 / 0
сравнить две таблицы
    #39916048
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn,

Надо не забыть ещё 2 момента:

1. Обработать Null-значения в полях табличек, например через NVL()

2. Построить индексы на таблички, что бы было разумное время выборки (хотя фокс не глуп и сам иногда строит временные индексы)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / сравнить две таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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