Имя: Пароль:
1C
1С v8
Помогите с запросом, как правильно соеденить таблицы
0 Tata001
 
26.10.12
11:33
Есть две таблицы

Таблица "Табличная Часть документа :
Морозова Оклад  
Морозова Доплата


Таблица "Расчет":


Морозова Доплата
Морозова Доплата

===========

Как мне реализовать Т1-Т2,
т.е. из первой таблицы убрать записи,которые есть во второй

Я делаю левые соединение по полям: т1.сотрудник =т2.сотрудник,
т1.ВидРасчета<>т2.ВидРасчета,при этом выводит 2 записи

Морозова Оклад
Морозова Оклад

===
т.е. строки задвоенные, группировки никакой нет.... Подскажи как правильно соеденить таблицы
1 sanja26
 
26.10.12
11:35
в поле набора данных галочка есть, не помню как назвается
2 Zmich
 
26.10.12
11:38
ВЫБРАТЬ РАЗЛИЧНЫЕ
3 lxndr
 
26.10.12
11:39
(2) не сработает, например, если во второй таблице будет

Морозова Доплата
Морозова Оклад
4 lighto1
 
26.10.12
11:42
Может быть левое соединение, а потом отбор по результату, где получился NULL в результате соединения. М? Или я не понял вопроса)
5 onx1
 
26.10.12
11:45
(0) может лучше не соединением, а вложенным запросом?

ВЫБРАТЬ ФИО, ВидРасчета ИЗ Т1 КАК Т1
ГДЕ НЕ (ФИО, ВидРасчета) В (ВЫБРАТЬ ФИО, ВидРасчета ИЗ Т2)
6 lxndr
 
26.10.12
11:47
(5) в точку
7 Tata001
 
26.10.12
12:04
(6)(5) хотелось бы соедением,т.к. вторая таблица состоит из множество запросов...
вот может мне в ТЗ загнать и запрос вложенный из ТЗ сделать
8 Zmich
 
26.10.12
12:11
(7). Тогда как в (4) можно сделать:

ВЫБРАТЬ
 Т1.ФИО
 Т1.ВидРасчета
ИЗ Т1 КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ
 Т2
ПО Т1.ФИО = Т2.ФИО И Т1.ВидРасчета = Т2.ВидРасчета
ГДЕ Т2.ВидРасчета ЕСТЬ NULL
9 Tata001
 
26.10.12
12:15
(8)задвоение строки из таблицы Т!
10 lxndr
 
26.10.12
12:15
(8) тоже не сработает, если (3)

С соединением можно так:

ВЫБРАТЬ
 Т1.ФИО
 Т1.ВидРасчета
ИЗ Т1 КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ
 Т2
   ПО Т1.ФИО = Т2.ФИО И Т1.ВидРасчета = Т2.ВидРасчета
СГРУППИРОВАТЬ ПО
   Т1.ФИО,
   Т1.ВидРасчета
ИМЕЮЩИЕ МАКСИМУМ(ВЫБОР КОГДА Т2.ФИО ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ) = ИСТИНА
11 lxndr
 
26.10.12
12:19
**(10)
С последним условием напутал, правильнее так:

ИМЕЮЩИЕ МАКСИМУМ(ВЫБОР КОГДА Т2.ФИО ЕСТЬ NULL ТОГДА 0 ИНАЧЕ 1 КОНЕЦ) = 0
12 3Jl0
 
26.10.12
12:20
(2) и усе?
13 GANR
 
26.10.12
12:22
(0)(9) Зачем их соединять?

ВЫБРАТЬ
   Т1.ФИО,
   Т1.ВидРасчета
ИЗ
   Т1 КАК Т1
ГДЕ
   НЕ (Т1.ФИО, Т1.ВидРасчета) В
               (ВЫБРАТЬ
                   Т2.ФИО,
                   Т2.ВидРасчета
               ИЗ
                   Т2 КАК Т2)

Правда, запрос выше, тоже содержит замаскированное соединение, но это не важно.
14 lxndr
 
26.10.12
12:25
(13) она желает соединять: (7)
15 Zmich
 
26.10.12
12:28
ВЫБРАТЬ РАЗЛИЧНЫЕ
 Т1.ФИО
 Т1.ВидРасчета
ИЗ Т1 КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ
 Т2
ПО Т1.ФИО = Т2.ФИО И Т1.ВидРасчета = Т2.ВидРасчета
ГДЕ Т2.ВидРасчета ЕСТЬ NULL

А так?
16 lxndr
 
26.10.12
12:31
(15)
Т1
1 Иванова Оклад
2 Иванова Премия

Т2
1 Иванова Премия
2 Иванова Оклад

Результат:
1 - 2 Иванова Оклад
2 - 1 Иванова Премия
17 lxndr
 
26.10.12
12:32
*(16)
Результат:
1 - 1 Иванова Оклад
1 - 2 Иванова Премия
18 Zmich
 
26.10.12
12:34
(17). Это почему еще?

Для твоего примера: из 1й таблицы берется строка, по условию соединения она находит такую же строку во 2-й. Однако не проходит проверку на  ГДЕ Т2.ВидРасчета ЕСТЬ NULL (раз такая строка в Т2 присутствует). Значит, в итоговую выборку эта строка не попадет. То же самое со 2-й строчкой.

Выборка в итоге будет пустой.
19 lxndr
 
26.10.12
12:43
(18) По твоему запросу.
Для первой строки Т1 соединение с первой строкой Т2 попадает в результат, т. к. соединение левое и Т2.ВидРасчета ЕСТЬ NULL
Имеем результат:
1 - 1 Иванова Оклад

Далее рассматривать смысла нет, т. к. такая строка уже есть в Т2. Со второй строкой Т1 то же самое.
20 lxndr
 
26.10.12
12:44
поэтому нужно группировать и отбирать по строкам, у которых не было вообще успешных соединений
21 ЭсОдин
 
26.10.12
12:45
Может быть так
Т1.ФИО,
Т1.ВидРасчета
ПОМЕСТИТЬ Совпадения
ИЗ Т1 КАК Т1
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Расчет КАК Расчет
   ПО Т1.ФИО = Расчет.ФИО
;
////все совпадения
Т1.ФИО,
Т1.ВидРасчета
 ИЗ Т1 КАК Т1
   ЛЕВОЕ СОЕДИНЕНИЕ Совпадения КАК Совпадения
ГДЕ
Совпадения.ФИО ЕСТЬ NULL  
/// исключили совпадения
22 Zmich
 
26.10.12
12:47
(19).
>>Для первой строки Т1 соединение с первой строкой Т2 попадает в результат

Не попадает, т.к. у нас есть условие соединения

ПО Т1.ФИО = Т2.ФИО И Т1.ВидРасчета = Т2.ВидРасчета

!
23 ЭсОдин
 
26.10.12
12:47
21 +
Пропущено
ЛЕВОЕ СОЕДИНЕНИЕ Совпадение КАК Совпадение
  ПО Т1.ФИО = Совпадение.ФИО
24 lxndr
 
26.10.12
12:47
(22) попадает: соединение ЛЕВОЕ! ))
(21) тоже, кстати, идея. ТОлько у тебя с полями соединения напутано
25 Zmich
 
26.10.12
13:08
(24). Всё, согласен с тобой, тупанул.
26 3Jl0
 
26.10.12
13:15
а если вложенный и условие не там ?
27 Tata001
 
26.10.12
13:45
(16)Результат должен быть только оклад
28 Zmich
 
26.10.12
13:48
Решил всё-таки проверить этот код.


Процедура КнопкаВыполнитьНажатие(Кнопка)
   Т1 = Новый ТаблицаЗначений;
   Т2 = Новый ТаблицаЗначений;
   Т1.Колонки.Добавить("ФИО", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
   Т1.Колонки.Добавить("ВидРасчета", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
   Т2.Колонки.Добавить("ФИО", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
   Т2.Колонки.Добавить("ВидРасчета", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
   Строка = Т1.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Оклад";
   Строка = Т1.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Доплата";
   Строка = Т2.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Доплата";
   Строка = Т2.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Оклад";
   
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   Запрос.УстановитьПараметр("Т1", Т1);
   Запрос.УстановитьПараметр("Т2", Т2);
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    Т1.ФИО КАК ФИО,
   |    Т1.ВидРасчета КАК ВидРасчета
   |ПОМЕСТИТЬ Таб1
   |ИЗ &Т1 КАК Т1;
   |
   |ВЫБРАТЬ
   |    Т2.ФИО КАК ФИО,
   |    Т2.ВидРасчета КАК ВидРасчета
   |ПОМЕСТИТЬ Таб2
   |ИЗ &Т2 КАК Т2;
   |
   |ВЫБРАТЬ
     |    Таб1.ФИО,
     |    Таб1.ВидРасчета
   |ИЗ Таб1 КАК Таб1
   |    ЛЕВОЕ СОЕДИНЕНИЕ
     |        Таб2 КАК Таб2
   |    ПО Таб1.ФИО = Таб2.ФИО И Таб1.ВидРасчета = Таб2.ВидРасчета
   |ГДЕ Таб2.ВидРасчета ЕСТЬ NULL";
   
   ТЗ = Запрос.Выполнить().Выгрузить();
   ТЗ.ВыбратьСтроку();
   
КонецПроцедуры

Результат - пустая выборка. Всё корректно.
29 Tata001
 
26.10.12
14:34
(28) почему пустая выборка-то?
30 Zmich
 
26.10.12
14:35
(29). Потому что

Строка = Т1.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Оклад";
   Строка = Т1.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Доплата";
   Строка = Т2.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Доплата";
   Строка = Т2.Добавить();
   Строка.ФИО = "Иванова";
   Строка.ВидРасчета = "Оклад";

Потестируй на своих примерах.
31 Tata001
 
26.10.12
14:53
(30) А мне зачем пустая выборка?
32 Zmich
 
26.10.12
14:56
(31). Это как пример. Я это написал по поводу спора с (19). Запрос рабочий, всё отрабатывается корректно.