|   |   | 
| 
 | Есть ли какой быстрый способ получить разностную таблицу/список значений ? | ☑ | ||
|---|---|---|---|---|
| 0
    
        smaharbA 27.10.13✎ 11:02 | 
        Есть две ТЗ с одинаковой структурой - как быстрее всего получить различающиеся строки, и небольшое дополнение нужно получить отличающиеся строки только из второй таблицы.     | |||
| 1
    
        smaharbA 27.10.13✎ 11:03 | 
        + метод желательно универсальный для ТЗ и СЗ, для упрощения в ТЗ такие колонки "Значение" и "Представление"     | |||
| 2
    
        zak555 27.10.13✎ 11:11 | 
        выбрать различные     | |||
| 3
    
        smaharbA 27.10.13✎ 12:19 | 
        (2) таблица/список могут быть невелики, запрос будет дольше чем перебор     | |||
| 4
    
        XLife 27.10.13✎ 12:47 | 
        (3) и в чем тогда вопрос? делай перебором...     | |||
| 5
    
        smaharbA 27.10.13✎ 13:41 | 
        (4) вопрос в ТЗ2 && ТЗ1     | |||
| 6
    
        mistеr 27.10.13✎ 15:15 | 
        (0) В смысле, строки из второй, которых нет в первой?
 Первую индексируем по Значение, затем цикл по второй. | |||
| 7
    
        Нуф-Нуф 27.10.13✎ 15:16 | 
        (27) полное соединение по всем полям. если таблицы динамические - собираешь запрос в цикле     | |||
| 8
    
        smaharbA 27.10.13✎ 15:31 | 
        Таблицы мелкие, не более 100 строк, а чаще до 10, но их бесконечное множество     | |||
| 9
    
        mistеr 27.10.13✎ 16:01 | 
        Другой метод - Слить две таблицы в одну с доп. колонкой "1", затем свернуть.     | |||
| 10
    
        aspirator23 27.10.13✎ 16:33 | 
        спроси vde69, у него есть алгоритм. Пользуюсь им уж лет пять.
 быстрый. | |||
| 11
    
        Torquader 27.10.13✎ 23:38 | 
        Если таблицы неупорядоченные - то только созданием копии и вычёркиванием (особенно, если попадаются полные дубли).
 Реально делается так: Выбираем таблицу с меньшим числом строк и копируем один в один. Далее, перебираем таблицу с большим числом строк и ищем соответствие в копии - если есть, то удаляем найденную строку из неё. Если не нашли - то запоминаем строку различия (в отдельную четвёртую таблицу). В конце получаем в таблицы-копии те строки, которые есть только в меньшей таблице, а в четвёртой таблице - те строки, которые есть только в большей. P.S. у меня по подобному принципу работает алгоритм отслеживания изменений в документах. | |||
| 12
    
        Torquader 27.10.13✎ 23:41 | 
        Если таблицы можно упорядочить - то пробежаться ленточным сравнением - начинаем сверху и идём до низу, выбирая и сравнивая строки.
 Так как строки упорядочены, то для каждой строки задано сравнение - если в какой-то таблице обнаруживается строка, которая "выше" строки в другой - то она только в этой таблице - на следующий шаг сдвигаемся только по ней. Если строки одинаковые, то сдвигаемся по обеим таблицам. | |||
| 13
    
        smaharbA 28.10.13✎ 07:58 | 
        (11)(12) единовременно сравниваются только 2 таблицы и результат нужен только от них.
 Сравнение идет прошлой таблицы с текущей и так бесконечно, т.е. на всем протяжении работы с программой. | |||
| 14
    
        mistеr 28.10.13✎ 10:53 | 
        (13) >и так бесконечно
 Пахнет кривым дизайном. | |||
| 15
    
        smaharbA 28.10.13✎ 21:53 | 
        (14) предложите лучше     | |||
| 16
    
        Fragster модератор 28.10.13✎ 21:55 | 
        запрос, затем поле +1 и -1, объединение, сворачивание, отбор
 или сразу отбор "не в" | |||
| 17
    
        smaharbA 28.10.13✎ 22:08 | 
        (16) возвращаюсь к техническим данным - что быстрее запрос или перебор на 10-и строках и 2-х колонках ?
 Нужен простой и быстрый метод, самое реальное свернуть, но свернуть ну оочень не быстрый и не легкий. | |||
| 18
    
        фобка 28.10.13✎ 22:12 | 
        имхо запрос быстрее (надо тестить), но перебор проще написать (найти строки)     | |||
| 19
    
        Classic 28.10.13✎ 22:13 | 
        (13)
 Массивы отсортированы? | |||
| 20
    
        smaharbA 28.10.13✎ 22:14 | 
        (18) т.е. создание+уничтожение временной таблицы быстрее ?     | |||
| 21
    
        фобка 28.10.13✎ 22:14 | 
        +18 на 10 строках всё одинаково быстрое, если это не обновление таблиц на форме     | |||
| 22
    
        Classic 28.10.13✎ 22:15 | 
        (18)
 Для неиндексированных таблиц спорное заявление | |||
| 23
    
        smaharbA 28.10.13✎ 22:18 | 
        (19) нет, и время на сортировку жалко тратить, хотя конечно, если выигрыш во времени (и не мало важно ресурсов) на разбор отсортированных покроет расходы на сортировку, то можно и сортировать.
 Для ускорения и снижения ресурсоемкости, таблицы даже были заменены на списки значений, но таблицы предпочтительнее (в СЗ теряю непомешавшую бы информацию) | |||
| 24
    
        Classic 28.10.13✎ 22:20 | 
        (23)
 Сортировка двух не покроет. Но за счет того, что отсортированная таблица сверяется в среднем два раза - хз. Неотсортированные массивы - это все равно в худшем случае полный перебор. Пофиг каким методом ты будешь их перебирать. | |||
| 25
    
        smaharbA 28.10.13✎ 22:21 | 
        Подумывал вообще о соответствии вместо тз или сз, тем более, что по сути "ключ" исходно уникален для каждой таблицы.
 Таблицы - это список мди-окон - хендл и заголовок. | |||
| 26
    
        smaharbA 28.10.13✎ 22:23 | 
        (24) понятно, что в конечном итоге перебор, но может быстрее реализован "внутре", чем когда прописан в коде 1с.     | |||
| 27
    
        Classic 28.10.13✎ 22:23 | 
        (25)
 А какая разница - соответствие или ТЗ. У тебя ж явно вопрос не в простоте реализации стоит. ИМХО стоит подумать о том, чтоб сравнивать на этапе формирования текущей ТЗ. Все равно обходишь данные пока пишешь в ТЗ | |||
| 28
    
        Classic 28.10.13✎ 22:28 | 
        Откуда ТЗ получаешь?     | |||
| 29
    
        mistеr 28.10.13✎ 23:14 | 
        (15) Я не знаю задачи.
 (17) Свернуть на 10 строках должно быть быстро. | |||
| 30
    
        smaharbA 29.10.13✎ 07:37 | 
        (27) вариант, пусть и несколько снизит универсальность.     | |||
| 31
    
        smaharbA 29.10.13✎ 07:39 | 
        (29) оно быстро конечно когда разово.
 (28) рекурсивно получаю дочерние окна главного окна, правдо с некоторым "фильтром" - интерес составляют только с текстом заголовка, с пустым не нужны. | |||
| 32
    
        1dvd 29.10.13✎ 07:45 | 
        +1 к свернуть     | |||
| 33
    
        1dvd 29.10.13✎ 07:48 | 
        (32) в одной ТЗ спецколонку заполнить единицами, во второй - нулями. Объединить, свернуть. НайтиСтроки где спецколонка = 0     | |||
| 34
    
        smaharbA 29.10.13✎ 07:52 | 
        (33) это известно, спасибо. Конечно померяю, но сомнения, что быстрее и менее ресурсоемко перебора будет на малых тз.     | |||
| 35
    
        smaharbA 29.10.13✎ 07:53 | 
        + да и объединить тз в восьмерке не такая уж быстрая операция.     | |||
| 36
    
        1dvd 29.10.13✎ 07:53 | 
        (33) + при условии, что нет дублей     | |||
| 37
    
        mistеr 29.10.13✎ 11:11 | 
        (31) И зачем тут сабж? одного стека (массива) не достаточно?     | |||
| 38
    
        Поросенок Петр 29.10.13✎ 11:47 | 
        И где вы вечно столько таблиц значений берете... Семерешкой попахивает.     | |||
| 39
    
        Ёпрст гуру 29.10.13✎ 11:52 | 
        (0) штатно, новая Колонка + заполнить 1/-1 объединить ТЗ через Заполнить и свернуть.
 усё. | |||
| 40
    
        Питерский_ Никола 29.10.13✎ 11:52 | 
        Хм... ТС какую-то вирусятину пишет ??? Скоро на всех 1С-ах страны "Для формирования ОСВ пришлите смс на номер бла-бла-бла )))"     | |||
| 41
    
        Ёпрст гуру 29.10.13✎ 11:53 | 
        Ну или ИТЗ использовать, там есть разность     | |||
| 42
    
        smaharbA 29.10.13✎ 14:40 | 
        (39) как в восьмерке объединить через заполнить ?     | |||
| 43
    
        Ёпрст гуру 29.10.13✎ 15:35 | 
        (42) ты предупреждай, что  в снеговике хоть :(
 там проще запросом всё лепить | |||
| 44
    
        badboychik 29.10.13✎ 15:41 | 
        хорошо писать на T-SQL, там можно сделать
 SELECT ... EXCEPT SELECT ... | |||
| 45
    
        Torquader 02.11.13✎ 11:57 | 
        Если пара HANLE-TITLE, то, скорей всего, HANDLE уникальный.
 Потом, по HANDLE имеет смысл сортировать, так как это число - и должно работать быстро, а строки уже потом можно сравнивать. Как вариант, объединить два параметра в одну строку и уже по ней сортировать таблицы (заранее), чтобы сравнение шло быстрее. Не забываем, что добавить строку в отсортированную таблицу проще, чем каждый раз её сортировать. Конечно, оптимальнее по производительности будут "деревья", но с ними нужно правильно работать, а это писать дольше. | |||
| 46
    
        kiruha 02.11.13✎ 12:29 | 
        (0)
 1)2-я таблица индексируется по всем полям. 2)Новая колонка - отметка 3)Создается структура со свойствами соотв колонкам 4) Для каждой строчки первой таблицы заполняется структура (заполнить значения свойств) 5) По структуре ищутся строки во второй таблице 6) Во всех найденных ставится пометка 7) Все строки без пометок 2 таблицы - искомые Сложность алгоритма 2n, т.е. 2 прохода | |||
| 47
    
        Torquader 02.11.13✎ 14:16 | 
        А вообще, я так понимаю, нужно получить тех, кто родился после последнего прохода - у меня была подобная задача с файлами - решение очевидно, нужно при добавлении в таблицу ставить единицу, а при проходе для обработки сбрасывать её в ноль - тогда нужно будет обрабатывать только строки с единицами.
 Если нужно отслеживать её и пропажу, то тем, кто есть, ставим двойки - потом те, у кого ноль, будут считаться потерянными. P.S. по данному принципу у меня работает файловый монитор, который в файлах получает события (а файлы отправители могут дописывать) - надо сказать, что работает достаточно быстро. | |||
| 48
    
        kiruha 02.11.13✎ 18:43 | 
        (46)+
 Этот алгоритм быстрее на порядок свертки и уж тем более помещения во временую таблицу | |||
| 49
    
        oleg_km 02.11.13✎ 20:11 | 
        Интересно, если прикрутить дот.нет и использовать его LINQ. Наверное долго будут данные в дот.нет перегоняться. ВК наверное можно сделать. В фокспро было очень удобно SQL использовать для курсоров (рекордсетов в памяти).     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |