![]() |
![]() |
|
как проще всего сравнить 2 таблицы | ☑ | ||
---|---|---|---|---|
0
Сергиус
27.06.11
✎
11:13
|
Необходимо определить, что две таблицы полностью идентичны(т.е. у них совпадает каждый соответствующий элемент каждой строки). Каким способом, кроме перебора сравнения по-элементно, это можно сделать наиболее правильно и элегантно?
|
|||
1
Ненавижу 1С
гуру
27.06.11
✎
11:14
|
(0) таблице в бд? тогда запросом
|
|||
2
Лефмихалыч
27.06.11
✎
11:14
|
запросом
|
|||
3
Сергиус
27.06.11
✎
11:15
|
А что именно сравнивать в запросе?
|
|||
4
Ненавижу 1С
гуру
27.06.11
✎
11:15
|
если это табзнач, то добавить колонку и добавить все строки второй таблицы к первой, при этом в доп. колоке первой установить 1, а у второй -1, свернуть, если будут <>0, то есть различия
|
|||
5
Ненавижу 1С
гуру
27.06.11
✎
11:15
|
(3) поля
|
|||
6
Лефмихалыч
27.06.11
✎
11:17
|
(3) таблицы. Сюрприз?
PS А что ты делал 3 г. 3 мес. ? |
|||
7
Ненавижу 1С
гуру
27.06.11
✎
11:18
|
(6) смотря где делал
|
|||
8
Лефмихалыч
27.06.11
✎
11:19
|
(7) судя по темам - в восьмерке
|
|||
9
Сергиус
27.06.11
✎
11:20
|
(6) я понимаю что таблицы. Просто в каждой таблице по 20 полей. Нужно каждое из этих 20-ти полей сравнить друг с другом в запросе?
p.s. Ты хочешь сказать, что сравнение таблиц такая часто встречающаяся задача? |
|||
10
Сергиус
27.06.11
✎
11:21
|
(4) Сделать свертку по 20-ти полям..?
|
|||
11
Лефмихалыч
27.06.11
✎
11:21
|
(9) Да, нужно полное соединение по условию совпадения всех полей
Любой запрос с соединением 2 и более таблиц - это по сути сравнение таблиц. |
|||
12
Сергиус
27.06.11
✎
11:23
|
(11) понятно..
|
|||
13
Сергиус
27.06.11
✎
11:24
|
В любом случае спасибо за советы Всем.
|
|||
14
Fragster
гуру
27.06.11
✎
11:24
|
сохранить в mxl, а потом сравнить через файл-сравнить файлы
|
|||
15
ВераТ
27.06.11
✎
11:25
|
функция типовой не подойдет?
// Функция сравнивает две таблицы значений на идентичность структуры и данных // // Параметры // ТаблицаЗначений1 - ТаблицаЗначений для сравнения // ТаблицаЗначений2 - ТаблицаЗначений для сравнения // // Возвращаемое значение: // Булево, идентичны или нет две таблицы // Функция СравнитьТаблицыЗначений(ТаблицаЗначений1, ТаблицаЗначений2) в общем модуле УправлениеКонтактами |
|||
16
Сергиус
27.06.11
✎
11:27
|
(15) то, что надо, спасибо!
|
|||
17
73
27.06.11
✎
11:28
|
(11) ТЗ с дублями запросом не сравнить...
|
|||
18
НЕА123
27.06.11
✎
11:31
|
(17)
НомерСтроки вроде есть. |
|||
19
73
27.06.11
✎
11:32
|
(1*) У ТЧ есть, у ТЗ - нет.
|
|||
20
73
27.06.11
✎
11:32
|
(19) -> (18)
|
|||
21
НЕА123
27.06.11
✎
11:32
|
(16)
кишки функции глянь. пойдет? |
|||
22
Ненавижу 1С
гуру
27.06.11
✎
11:33
|
(17) а если через объединение и группировку подобно (4) ?
|
|||
23
Сергиус
27.06.11
✎
11:35
|
(21) похоже на правду.
|
|||
24
Сергиус
27.06.11
✎
11:36
|
Взял из типовой бух:
Функция СравнитьТаблицыНаборовЗаписей(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт Если ТипЗнч(ТаблицаЗначений1) <> Тип("ТаблицаЗначений") ИЛИ ТипЗнч(ТаблицаЗначений2) <> Тип("ТаблицаЗначений") Тогда Возврат Ложь; КонецЕсли; Если ТаблицаЗначений1.Количество() <> ТаблицаЗначений2.Количество() Тогда Возврат Ложь; КонецЕсли; Если ТаблицаЗначений1.Колонки.Количество() <> ТаблицаЗначений2.Колонки.Количество() Тогда Возврат Ложь; КонецЕсли; // Проверим поля Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл Если ТаблицаЗначений2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл Если ТаблицаЗначений1.Колонки.Найти(Колонка.Имя) = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЦикла; // сформируем строку индекса для оптимизации поиска по таблице значений СтрокаИндекса = ""; Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл Если СтрокаИндекса = "" Тогда СтрокаИндекса = Колонка.Имя; Иначе СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя; КонецЕсли; КонецЦикла; // добавим индекс ТаблицаЗначений2.Индексы.Добавить(СтрокаИндекса); // Проверим записи Для каждого СтрокаТаблицы Из ТаблицаЗначений1 Цикл СтруктураПоиска = Новый Структура; Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]); КонецЦикла; СтрокиТаблицы2 = ТаблицаЗначений2.НайтиСтроки(СтруктураПоиска); Если СтрокиТаблицы2.Количество() <> 1 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; // сформируем строку индекса для оптимизации поиска по таблице значений СтрокаИндекса = ""; Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл Если СтрокаИндекса = "" Тогда СтрокаИндекса = Колонка.Имя; Иначе СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя; КонецЕсли; КонецЦикла; // добавим индекс ТаблицаЗначений1.Индексы.Добавить(СтрокаИндекса); Для каждого СтрокаТаблицы Из ТаблицаЗначений2 Цикл СтруктураПоиска = Новый Структура; Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]); КонецЦикла; СтрокиТаблицы1 = ТаблицаЗначений1.НайтиСтроки(СтруктураПоиска); Если СтрокиТаблицы1.Количество() <> 1 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции // СравнитьТаблицыЗначений() |
|||
25
73
27.06.11
✎
11:36
|
(22) Так получится. Соединением - нет.
|
|||
26
Vbonivur
27.06.11
✎
11:37
|
(0) Меню Файл -> Сравнить файлы ... думаю проще некуда
|
|||
27
Лефмихалыч
27.06.11
✎
11:40
|
(17) долго строки пронумеровать?
|
|||
28
Сергиус
27.06.11
✎
11:40
|
(26) какие файлы то сравнивать? речь идет о таблицах как об объектах 1с.
|
|||
29
73
27.06.11
✎
11:42
|
(27) Долго-недолго, но без этого (11) не будет работать.
ЗЫ. Существенное замечание. |
|||
30
73
27.06.11
✎
11:46
|
И кстати, в (24):
индекс идентичных строк игнорируется; дубли - не допускаются. |
|||
31
НЕА123
27.06.11
✎
11:47
|
(29)
хз. (24) автору понравилось. хотя там... про дубли уж молчу. |
|||
32
73
27.06.11
✎
11:59
|
(31) Ну да.
Сначала бы определиться поточнее: что есть полностью идентичные таблицы. И возможны ли в них дубли строк. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |