|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
Здравствуйте! возникла необходимость сравнить две таблицы 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 + записей, есть ли иной какой-либо способ ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2020, 16:21 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 12:48 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
Это курсоры, полученные Select - sql в FoxPro 9, количество записей может не совпадать тоже. Честно говоря, приведенный код не очень понятен. create table #t1 (f1 int, f2 int, f3 int) - это имелось ввиду создать поля как Integer ? и запрос не получается оформить. select * == select all ? да и сам запрос как-то не знакомо выглядит. Не могли бы вы мне чуть подробнее пояснить ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 13:58 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 14:16 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
982183, Спасибо за ссылку. Однако легче мне не стало, SQL мне не знаком ( Интуитивно что-то понятно, что-то меньше, записать запрос из примера PaulWist не получается. Нельзя ли как-то с привязкой к фоксу запрос показать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 14:36 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
Ну что-то у меня никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 16:27 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 17:08 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
PaulWist, моя самая искренняя благодарность и уважение за оказанную помощь! тестовые таблички работают, сейчас попробую просканировать всю базу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 17:36 |
|
сравнить две таблицы
|
|||
---|---|---|---|
#18+
DmitryKn, Надо не забыть ещё 2 момента: 1. Обработать Null-значения в полях табличек, например через NVL() 2. Построить индексы на таблички, что бы было разумное время выборки (хотя фокс не глуп и сам иногда строит временные индексы) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 17:49 |
|
|
start [/forum/topic.php?fid=41&fpage=5&tid=1581595]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
24ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 293ms |
total: | 400ms |
0 / 0 |