|
Вопрос по запросам. Вразить( ххх как ) В конструкции ГДЕ или внутреннее соединение? | ☑ | ||
---|---|---|---|---|
0
MakaMaka
10.06.19
✎
11:01
|
Всем привет.
Не пойму как оптимально составить запрос. Задача проста, надо получить реализации, которые введены на основании возврата товаров от клиента, возвраты товаров берутся с отбором по определенному менеджеру. Варианта получения данных много, я приведу 2 варианта, каждый описан в отдельном пакете. В первом пакете, надо ли использовать метод выразить в конструкции ГДЕ? Какой запрос оптимальнее для системы? Если есть метод более оптимальный, а я уверен что он есть, то напишите о нем пожалуйста, интересно, для саморазвития. ВЫБРАТЬ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер = &Менеджер ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО ((ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента)) = ВозвратТоваровОтКлиента.Ссылка) ГДЕ ВозвратТоваровОтКлиента.Контрагент = &Контрагент |
|||
1
toypaul
гуру
10.06.19
✎
11:03
|
не надо выразить
|
|||
2
toypaul
гуру
10.06.19
✎
11:03
|
второй вариант без выразить
|
|||
3
Вафель
10.06.19
✎
11:04
|
в 1 запросе система сделает ЛЕВОЕ соединение.
в этом все отличие |
|||
4
MakaMaka
10.06.19
✎
11:04
|
(2) А если в соединении стоит задача соединиться по менеджеру из РТиУ и Возврата, то с выразить?
|
|||
5
MakaMaka
10.06.19
✎
11:05
|
(3) Фактически да, левое соединение работает быстрее чем внутренее, поэтому и вопрос, но по первому запросу, вопрос по методы выразить в условии открыт )
|
|||
6
MakaMaka
10.06.19
✎
11:06
|
НО в первом запросе, не будет ли столько левых соединений к базе сколько реализаций? или там дальше запрос преобразуется в планировщике?
|
|||
7
RomanYS
10.06.19
✎
11:06
|
ВЫБРАТЬ
ВозвратТоваровОтКлиента.Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО РеализацияТоваровУслуг.ДопоставкаПоРеализации = ВозвратТоваровОтКлиента.Ссылка ГДЕ ВозвратТоваровОтКлиента.Контрагент = &Контрагент |
|||
8
MakaMaka
10.06.19
✎
11:07
|
(7) Можно узнать почему?
|
|||
9
lodger
10.06.19
✎
11:08
|
"выразить" в условии использовать не очень, это ж функция приведения значений - лучше разбить условия на 2:
РеализацияТоваровУслуг.ДопоставкаПоРеализации Ссылка Документ.ВозвратТоваровОтКлиента И РеализацияТоваровУслуг.ДопоставкаПоРеализации.Менеджер = &Менеджер |
|||
10
RomanYS
10.06.19
✎
11:11
|
(8) А зачем снова делать неявное левое (твое ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер), если у тебя уже есть явное внутреннее?
|
|||
11
MakaMaka
10.06.19
✎
11:12
|
Так народ, давайте вопросы по очереди. В первом запросе в конструкции Где нужен метод Выразить() ?
Чем с точки зрения ресурсов второй пакет в запросе оптимальнее? |
|||
12
lodger
10.06.19
✎
11:13
|
(11) ты лучше скажи, зачем тебе таблица "Документ.РеализацияТоваровУслуг" вообще? ни условий, ни полей из нее.
|
|||
13
MakaMaka
10.06.19
✎
11:13
|
(10) Не понял вопроса, это просто два варианта получения данных в пакетах. Т.е. в практике будет использоваться какой то 1 запрос из первого или второго пакета.
|
|||
14
MakaMaka
10.06.19
✎
11:13
|
(12) Да это тестовый пример. Я разобраться для себя хочу.
|
|||
15
MakaMaka
10.06.19
✎
11:15
|
Понятно, что можно посмотреть как по скорости отработает консоль и выбрать лучший вариант, но я хочу именно разобраться что лучше и правильнее использовать.
|
|||
16
MakaMaka
10.06.19
✎
11:41
|
Все разбежались? не поговорим?
|
|||
17
lodger
10.06.19
✎
11:46
|
(16) нет, не поговорим. все ответы дали выше.
|
|||
18
RomanYS
10.06.19
✎
11:48
|
(16) В первом твоем варианте два неявных левых соединения, в втором тоже два плюс явное внутреннее.
Конечно могут быть нюансы оптимизации левое VS внутреннее. Но наличие лишних (бесполезных) соединений оптимальным быть не может. |
|||
19
MakaMaka
10.06.19
✎
11:50
|
(18) А точно в соединении в втором пакете будет неявное соединение? Я в этом не уверен, мы же просто ссылку берем?
|
|||
20
MakaMaka
10.06.19
✎
11:52
|
Т.е. берем значение реквизита "ДопоставкаПоРеализации", и ищем по этой ссылке документ Возврат. Тут не должно быть соединения по сути, вот если бы мы по менеджеру соединялись, то да, было бы соединение точно. Мне кажется что во втором пакете вообще можно написать:
ВЫБРАТЬ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО РеализацияТоваровУслуг.ДопоставкаПоРеализации = ВозвратТоваровОтКлиента.Ссылка) ГДЕ ВозвратТоваровОтКлиента.Контрагент = &Контрагент |
|||
21
MakaMaka
10.06.19
✎
11:53
|
Блин, походя ЯССЗБ причем жесткий)))))))))))
|
|||
22
RomanYS
10.06.19
✎
11:56
|
(20) >> и ищем по этой ссылке документ Возврат
Это "ищем" и есть соединение |
|||
23
MakaMaka
10.06.19
✎
12:00
|
(22) Так, я потерялся в терминологии.
Господа, правильно ли я понимаю, что первое неявное левое соединение тут: ВЫБРАТЬ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер КАК Менеджер А второе соединения явное и внутреннее, по ссылке: ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО ((ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента)) = ВозвратТоваровОтКлиента.Ссылка) Т.е. получается во втором запросе: 1. Неявное соединение 2. Явное соединение. Итого 2 соединения, одно явное внутреннее, второе неявное левое. Так? Если нет, то поправьте плиииииииз |
|||
24
RomanYS
10.06.19
✎
12:04
|
(23) Насчет второго неявного в условии возможно я загнул. Но вот это ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер точно соединение, и абсолютно бестолковое: таблица Документ.ВозвратТоваровОтКлиента уже доступна из внутреннего
|
|||
25
MakaMaka
10.06.19
✎
12:18
|
(24) Согласен полностью.
А если так: ВЫБРАТЬ РеализацияТоваровУслуг.Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер = &Менеджер ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РеализацияТоваровУслуг.Менеджер КАК Менеджер ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО ((ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента)) = ВозвратТоваровОтКлиента.Ссылка) ГДЕ ВозвратТоваровОтКлиента.Контрагент = &Контрагент А что кажется тут оптимальным? наверное запрос из первого пакета, т.к. там идет запрос к документам реализаций, а потом проверяется их реквизит ДопоставкаПоРеализации, а потом в оставшихся записях смотрим реквизит менеджер. Но тут есть вопрос, как оптимальнее писать в условии : 1. Как у меня ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер = &Менеджер 2. Как в (9) РеализацияТоваровУслуг.ДопоставкаПоРеализации Ссылка Документ.ВозвратТоваровОтКлиента И РеализацияТоваровУслуг.ДопоставкаПоРеализации.Менеджер = &Менеджер Не будет ли неявного соединения во втором случае? |
|||
26
Вафель
10.06.19
✎
12:22
|
(9) без выразить смысла не имеет.
в 1с нет умного оптимизатора, который по условиям отсчет ненужные соединение. а вот по выразить есть |
|||
27
MakaMaka
10.06.19
✎
12:30
|
(26) Т.е. нет разницы:
1. Как у меня ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента).Менеджер = &Менеджер 2. Как в (9) РеализацияТоваровУслуг.ДопоставкаПоРеализации Ссылка Документ.ВозвратТоваровОтКлиента И РеализацияТоваровУслуг.ДопоставкаПоРеализации.Менеджер = &Менеджер Т.к. это одно и тоже? |
|||
28
MakaMaka
10.06.19
✎
12:30
|
Или лучше явно указать выразить в запросе?
|
|||
29
MakaMaka
10.06.19
✎
12:30
|
А если лучше указать, то для чего?
|
|||
30
Вафель
10.06.19
✎
12:35
|
(27) не одно
|
|||
31
singlych
10.06.19
✎
12:48
|
(25) во втором запросе поставь таблицу Документ.ВозвратТоваровОтКлиента слева и подумай, нафига там в соединении ВЫРАЗИТЬ
|
|||
32
MakaMaka
10.06.19
✎
13:05
|
(31) Не понял что куда подставить. В соединении
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента ПО ((ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДопоставкаПоРеализации КАК Документ.ВозвратТоваровОтКлиента)) = ВозвратТоваровОтКлиента.Ссылка) ДОЛЖНО РАБОТFNM ИДЕНТИЧНО РеализацияТоваровУслуг.ДопоставкаПоРеализации = ВозвратТоваровОтКлиента.Ссылка Т.к. в реквизите ДопоставкаПоРеализации просто ссылка стоит и она выведется. Понимаю, что если в запросе надо выбрать поле ДопоставкаПоРеализации без отбора, то выбрать можно через ., но лучше будет сделать через Объединенить Все, с отбором по типу, там рекомендует товарищ Гилев. |
|||
33
los_hooliganos
10.06.19
✎
13:14
|
Выгоднее всего сделать подзапрос для ГДЕ
ГДЕ РеализацияТоваровУслуг.ДопоставкаПоРеализации В (Выбрать ВозвратТоваровОтКлиента.Ссылка Из ВозвратТоваровОтКлиента ГДЕ ВозвратТоваровОтКлиента.Менеджер = &Продаван) |
|||
34
singlych
10.06.19
✎
13:15
|
(32) Я предложил поменять таблицы местами в соединении, подумал что так нагляднее будет.
Идентично будет по результату, но не по процессу, т.к. значения допоставки других типов будут преобразовываться в пустые ссылки на возврат. А зачем лишние действия, если на условие соединения это не влияет? |
|||
35
los_hooliganos
10.06.19
✎
13:15
|
(33) И главное понятно все безо всяких ВЫРАЗИТЬ извращений
|
|||
36
MakaMaka
10.06.19
✎
13:40
|
(33) Возможно, но это не точно. Можете однозначно сказать чем лучше подзапрос в данной ситуации?
|
|||
37
MakaMaka
10.06.19
✎
13:43
|
(34) Аааа, типа обратиться к возвратам, отобрать по продавану, получить таблицу потом соединиться с Реализацией внутренним соединением? В соединении указать
РеализацияТоваровУслуг.ДопоставкаПоРеализации = ВозвратТоваровОтКлиента.Ссылка И ВозвратТоваровОтКлиента.Менеджер = Продаван Так? |
|||
38
MakaMaka
10.06.19
✎
13:48
|
РеализацияТоваровУслуг.ДопоставкаПоРеализации = ВозвратТоваровОтКлиента.Ссылка
И ВозвратТоваровОтКлиента.Менеджер = &Продаван Да, это ускорит процесс получения данных, т.к. получим те записи которые нам нужны без конструкции ГДЕ |
|||
39
singlych
10.06.19
✎
13:56
|
(37) Типа того. Правда, можно теоретически нарваться на то, что оптимизатор с внутренним соединением может не понять, что отбирать нужно до соединения (с левым соединением, по моему опыту, он лучше справляется). Возможно, имеет смысл предварительно отобрать нужные возвраты в ВТ, ну или как в (33), тут не знаю, что быстрее получится.
|
|||
40
MakaMaka
10.06.19
✎
13:58
|
(39) Ясно. Всем огромное спасибо, было приятно пообщаться.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |