|
Помогите с запросом, как правильно соеденить таблицы | ☑ | ||
---|---|---|---|---|
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). Запрос рабочий, всё отрабатывается корректно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |