Имя: Пароль:
1C
1С v8
Сравнение двух таблиц в запросе
0 r1000
 
30.11.14
17:44
Есть две одинаковые по колонкам таблицы (номенклатуру, количество - т.е. в таблицах всего две колонки).
Задача сравнить исходные таблицы и получить таблицу с отличающимся количеством номенклатуры. т.е. буквально необходимо понять, что в 1ой таблице номенклатуры Х больше на 2шт, номенклатуры Х1 меньше на 1 шт и т.д. Перебором то у меня получается, но хочется сделать это запросом, т.к. таблицы могут быть до 150 строк в каждой - наверное запросом быстрей ? Спасибо.
1 vicof
 
30.11.14
17:47
ВЫБРАТЬ * ИЗ &ВТ1 ПОЛНОЕ СОДЕНИНЕНИЕ &ВТ2
2 r1000
 
30.11.14
17:49
Т.е. сначала получить совпадающие строки, удалить их из исходных таблиц и дальше уже перебором по 2м таблицам бегать ?
3 r1000
 
30.11.14
18:02
Спасибо. (перепутал с внутренним сначала)
4 vicof
 
30.11.14
18:13
Соединяешь по номенклатуре и неравному количеству
5 r1000
 
30.11.14
19:15
Выяснился нюанс. В одной из исходных таблиц может вообще не быть какой то номенклатуры. Поэтому, результат запроса все равно обрабатывать перебором нужно...
6 braslavets
 
30.11.14
19:20
ВЫБРАТЬ СУмма(Количество),
Номенклатура
(ВЫБРАТЬ -Количество,
Номенклатура Из &Первая
Объедини
-Количество,
Номенклатура Из &Вторая)  Подзапрос
Сгруппировать ПО Номенклатура
ИМЕЮЩИЕ
СУмма(Количество) <> 0
7 ILM
 
гуру
30.11.14
19:23
(6) Самое оптимальное, если минус количество, то номенклатура есть в первой таблице, а если плюс, то во второй.
8 Sorm
 
30.11.14
20:03
(6) Зачем с группировкой? Сервак грузить... Можно просто из полного соединения:
Идея:
Выбрать
Выбор когда Ном1 есть null тогда Ном2 иначе Ном1 конец,
естьNull(Кол1,0)-естьNull(Кол1,0)
из
1 полное соединение 2
по
Номенклатура
где
естьNull(Кол1,0) <> естьNull(Кол2,0)
9 RomanYS
 
30.11.14
20:09
(8) не знаю, что там в SQL
Но чаще делаю как (6): проще и нагляднее, точно нигде не вылезет NULL ))
10 r1000
 
30.11.14
20:14
(6)В результат попадает и та номенклатура, по которой полное совпадение. Строки, по которым все хорошо мне не нужны.
11 spero
 
30.11.14
20:17
(10) Сначала полное соединение, потом условие.
12 Sorm
 
30.11.14
20:21
(6) Тогда первый или второй минус в подзапросе убери, чтобы человек получил только отличия...
13 r1000
 
30.11.14
20:22
(1)Спасибо.
(8)Спасибо за условие.
У меня получилось вот так. Может и не оптимально, но остаются только строки по которым нет соответствия между таблицами.
        ЗапросСравнение.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                                |   ТекущаяТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
                                |   ТекущаяТаблицаНоменклатуры.Количество КАК Количество
                                |ПОМЕСТИТЬ ВТ1
                                |ИЗ
                                |   &ТекущаяТаблицаНоменклатуры КАК ТекущаяТаблицаНоменклатуры
                                |;
                                |
                                |////////////////////////////////////////////////////////////////////////////////
                                |ВЫБРАТЬ
                                |   ВТ1.Номенклатура,
                                |   ВТ1.Количество,
                                |   ПоследняяТаблицаРазмещения.Номенклатура КАК ПоследняяНоменклатура,
                                |   ПоследняяТаблицаРазмещения.Количество КАК ПоследняяКоличество
                                |ПОМЕСТИТЬ РезультатСоединения
                                |ИЗ
                                |   ВТ1 КАК ВТ1
                                |       ПОЛНОЕ СОЕДИНЕНИЕ ПоследняяТаблицаРазмещения КАК ПоследняяТаблицаРазмещения
                                |       ПО ВТ1.Номенклатура = ПоследняяТаблицаРазмещения.Номенклатура
                                |;
                                |
                                |////////////////////////////////////////////////////////////////////////////////
                                |ВЫБРАТЬ
                                |   РезультатСоединения.Номенклатура,
                                |   РезультатСоединения.Количество,
                                |   РезультатСоединения.ПоследняяНоменклатура,
                                |   РезультатСоединения.ПоследняяКоличество
                                |ИЗ
                                |   РезультатСоединения КАК РезультатСоединения
                                |ГДЕ
                                |   ЕСТЬNULL(РезультатСоединения.Количество, 0) <> ЕСТЬNULL(РезультатСоединения.ПоследняяКоличество, 0)";
14 r1000
 
30.11.14
20:24
(6)Попробовал, но врубиться не получилось(((
15 Sorm
 
30.11.14
20:26
(13) Все верно, но можно и без таблицы "Результат соединения" + у тебя будет "шахматка" по номенклатуре из двух таблиц, по которым не прошло соединения. Поскольку нужно брать либо из первой таблицы, либо из второй - лучше написать "Выбор" по номенклатуре 1 или 2 таблицы.
16 RomanYS
 
30.11.14
20:29
(15) тогда уж не "выбор" , а ЕСТЬNULL(Т1.Номенклатура,Т2.Номенклатура)
17 Sorm
 
30.11.14
20:31
(14) Там нужно 1 минус убрать в подзапросе. А вообще рекомендую http://sql-ex.ru/
(15) Да. Но я хотел показать идею, а то вон человек путается, а такая конструкция с ходу менее понятна.
18 RomanYS
 
30.11.14
20:32
(8) + если номенклатура может повторяться внутри одной таблицы - получишь "кашу" из дублей
(6) более универсально
19 Sorm
 
30.11.14
20:33
(18) Больше грузит сервер:)
20 RomanYS
 
30.11.14
20:35
(19) если дубли могут быть, то всё равно придется группировать, только предварительно.
Ладно мы друг друга поняли )
21 r1000
 
30.11.14
20:39
(20)дублей быть не может.
(15)да. получается шахматка. а мне и нужны номенклатуры по которым нет соединения или не равно по количеству. дальше я эту табличку уже обработаю как мне нужно перебором.
22 2mugik
 
01.12.14
06:17
(8)Ты хочешь сказать(грубо) что полное соединение это N квадрат, а объединение + группировка в данном случае это (2N) квадрат?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.