|
v8: Проблема понимания запроса с ЛЕВЫМ СОЕДИНЕНИЕМ | ☑ | ||
---|---|---|---|---|
0
Fedor-1971
13.06.14
✎
10:08
|
Доброго времени суток!
Пятница, однако либо туплю, либо не правильно понимаю работу Левого соединения в запросе. Есть документы: Док1 Док2 Есть регистр сведений: Док. Задача Срок выполн Готова Выполнена Отчёт Док1| ммммм| 25/05/2014| Истина| 01/04/2014 00:00 |ААААА Док1| ттттт| 25/05/2014| Истина| 01/04/2014 00:00 |БББББ Док1| rrrrr| 25/05/2014| Ложь | 00/00/0000 00:00 | Док2| ттттт| 25/05/2014| Истина| 05/04/2014 00:00 |ВВВВВ Док2| ннннн| 25/05/2014| Ложь | 00/00/0000 00:00 | Задача: выбрать все документы и подтянуть каждому максимальную дату выполнения с отчётом, т.е. в идеале: Док1| 01/04/2014 00:00 |ААААА - в принципе без разницы ААААА или БББББ Док2| 05/04/2014 00:00 |ВВВВВ сделал вот такой запрос: ВЫБРАТЬ Док.Ссылка, ИнфоТочка.Выполнена КАК тчкДатаИсполнения, ИнфоТочка.Отчет КАК тчкСодержание ИЗ Документ.Услуга КАК Док ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ инфо.Услуга КАК Услуга, Максимум(инфо.Выполнена) КАК Выполнена, инфо.Отчет КАК Отчет ИЗ РегистрСведений.УслугиМаршрутПлан КАК инфо ГДЕ инфо.Готова СГРУППИРОВАТЬ ПО инфо.Услуга, инфо.Отчет) КАК инфо) КАК ИнфоТочка ПО Док.Ссылка = ИнфоТочка.Услуга В результате получаю: Док1| ммммм| 01/04/2014 00:00 |ААААА Док1| ттттт| 01/04/2014 00:00 |БББББ Док2| ттттт| 05/04/2014 00:00 |ВВВВВ Всюду написано, что левое соединение отбрасывает те записи которых нет в исходной выборке, т.е. должно было либо выбросить строку 2, либо вылететь с ошибкой, что не могу построить результирующую выборку, поскольку неоднозначность в колонке Отчет. Так где ошибка, в запросе или в понимании Левого соединения? |
|||
1
Рэйв
13.06.14
✎
10:11
|
СГРУППИРОВАТЬ ПО
инфо.Услуга, инфо.Отчет Он тебе дает максимум по каждой паре группировок. Оставь только Отчет. |
|||
2
Fedor-1971
13.06.14
✎
10:12
|
(0)+ ошибся в картинке результирующей выборки:
Док1| 01/04/2014 00:00 |ААААА Док1| 01/04/2014 00:00 |БББББ - в теории этой строки не должно быть! но она формируется. Док2| 05/04/2014 00:00 |ВВВВВ |
|||
3
Fedor-1971
13.06.14
✎
10:15
|
(1) не пойдёт, ошибка "не входит в группу, тут больше бы подошло "сгруппировать по услуга", но ошибка та же
|
|||
4
Рэйв
13.06.14
✎
10:17
|
(3)Количество полей без агрегатных функций в Выбрать должно соответсоввать количеству в Сгруппировать. Потому так и пишет, что ты только в одном месте убираешь
|
|||
5
sda553
13.06.14
✎
10:18
|
Внутренний зпрос:рс, сгруппировать по доку, получить макстмальную дату
Внешний запрос 1: к внутр запросу опять присоединить рс по доку и дате, сгруппировать по док и дате, выбрать макс отчет. Внешний запрос 2: к внешн запросу 1 присоединить доки |
|||
6
Fedor-1971
13.06.14
✎
10:23
|
(5) записей с максимальной датой 2 и различаются, например, только отчётом. Тут даже через РАЗЛИЧНЫЕ не пройдёт.
Получается нужно выбрать ПЕРВЫЕ 1 но для каждого документа из исходной выборки |
|||
7
sda553
13.06.14
✎
10:24
|
(6) Именно поэтому я и сделал внешний запрос1, чтобы отрубить случаи когда даты равны и отличие в отчете
|
|||
8
Fedor-1971
13.06.14
✎
10:33
|
(7) макс. отчет - Отчёт строкового типа и как определить что он максимальный?
Тогда уж проще сразу запросить Муксимум(инфо.Отчет). Но вопрос собственно в том почему в результате Левое соединение в выборку попадают все записи из обеих таблиц, хотя должна дополниться только исходная. |
|||
9
viktor_vv
13.06.14
✎
10:43
|
Птому что у тебя в подзапросе ролучилось две строки с Док1, соответственно исходная таблица задвоила эту строку.
|
|||
10
Fedor-1971
13.06.14
✎
10:58
|
(9) Это понятно, но по логике запрос должен либо выбрать любую из строк либо вывалиться с ошибкой. Ни где не оговорено что левая выборка должна иметь не более одной строки на строку исходной
|
|||
11
catena
13.06.14
✎
11:02
|
(10)"Это понятно, но по логике запрос должен либо выбрать любую из строк либо вывалиться с ошибкой. "
Да с чего бы это? Ты ему говоришь: "Накидай мне к Док1 что ты там нашел", почему он должен за тебя думать, сколько тебе надо - все или одно? "макс. отчет - Отчёт строкового типа и как определить что он максимальный? Тогда уж проще сразу запросить Муксимум(инфо.Отчет)." Тебе советуют Муксимум(инфо.Отчет) _только_ если у тебя два отчета в одну дату. Тут уж надо как-то выбирать, если кровь из носа нужна одна строка. Т.е. сначала ищем по документу максимальную дату, потом к этому документу и этой дате ищем единственный отчет (максимум, минимум, агрегатной функции "ЛЮБОЙ" пока не сделали) и уже эту конструкцию можно присоединять к твоему списку документов. |
|||
12
Мимохожий Однако
13.06.14
✎
11:09
|
Добавь условие Готова = Истина
|
|||
13
Fedor-1971
13.06.14
✎
11:17
|
(11) Так из описания языка запросов следует:
ЛЕВОЕ СОЕДИНЕНИЕ - ко всем записям из левой таблицы присоединяются записи правой удовлетворяющие условию ПРАВОЕ СОЕДИНЕНИЕ - наоборот ПОЛНОЕ СОЕДИНЕНИЕ - Все записи левой + все записи правой соединённые по условию т.е. если в левой таблице больше чем одна строка на строку правой таблицы получится ПОЛНОЕ СОЕДИНЕНИЕ (12) Две готовых записи, с одинаковыми датами, Максимум(инфо.Отчет) решит проблему двух строк в левой таблице. |
|||
14
Мимохожий Однако
13.06.14
✎
11:21
|
(13)Тебе виднее...
В 1С все правые соединения переводятся в левые. Сохрани тест запроса. Открой заново и увидишь. |
|||
15
catena
13.06.14
✎
11:32
|
(13)Странные выводы. "удовлетворяющие условию" - не означает "одна из удовлетворяющих условию". Он нашел две строки удовлетворяющие, две и присоединил. Полное соединение - совсем другое.
|
|||
16
catena
13.06.14
✎
11:36
|
ТЗ1
Док1 Док2 Док3 ТЗ2 Док1 Значение1 Док1 Значение2 Док4 Значение4 выбрать ТЗ1 левое соединение ТЗ2 по Док: Док1 Значение1 Док1 Значение2 Док2 NULL Док3 NULL выбрать ТЗ1 полное соединение ТЗ2 по Док: Док1 Значение1 Док1 Значение2 Док2 NULL Док3 NULL NULL Значение4 |
|||
17
rendez-vous
13.06.14
✎
11:58
|
(13) Описание у тебя плохое.
ЛЕВОЕ СОЕДИНЕНИЕ - к каждой записи из левой таблицы присоединяются все записи из правой, удовлетворяющие условию, если таких записей нет совсем, тогда запись из левой таблицы остается в гордом одиночестве, а в колонках из правой таблицы появляются значения NULL. |
|||
18
Fedor-1971
13.06.14
✎
13:08
|
Всем спасибо. Ясность работы с запросами в 1С повысилась.
|
|||
19
catena
13.06.14
✎
13:39
|
(18)Скульные джойны работают по тому же принципу, так что скилл реально прокачался)))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |