Имя: Пароль:
1C
1С v8
Где указывать условие в запросе когда есть связи
,
0 vii88
 
13.12.12
15:12
Принципиален ли момент где устанавливать условия в запросе, когда есть связи

Пример:

ВЫБРАТЬ
   Таблица1.Поле1 КАК Поле11,
   Таблица1.Поле2 КАК Поле12,
   Таблица2.Поле1 КАК Поле21,
   Таблица2.Поле2 КАК Поле22
ИЗ
   Таблица1 КАК Таблица1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
       ПО Таблица1.Поле1 = Таблица2.Поле1
           И (Таблица2.Поле2 = &Параметр2)
ГДЕ
   Таблица1.Поле2 = &Параметр1


В запросе мне нужно соединить таблицы по Поле1
а так же для Таблица1.Поле2 задать условие &Параметр1
И Таблица2.Поле2 задать условие&Параметр2
1 DrShad
 
13.12.12
15:13
в полях соединения и указывай
2 DrShad
 
13.12.12
15:14
ВЫБРАТЬ
   Таблица1.Поле1 КАК Поле11,
   Таблица1.Поле2 КАК Поле12,
   Таблица2.Поле1 КАК Поле21,
   Таблица2.Поле2 КАК Поле22
ИЗ
   Таблица1 КАК Таблица1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
       ПО Таблица1.Поле1 = Таблица2.Поле1
           И (Таблица2.Поле2 = &Параметр2)
           И Таблица1.Поле2 = &Параметр1
3 DrunkAnimal
 
13.12.12
15:14
при внутреннем без разницы
4 andreymongol82
 
13.12.12
15:15
Да принципиально. Сегодня уже была подобная тема
5 Kashemir
 
13.12.12
15:15
Условия соединения режут записи сразу ... условия режут результат. Соответственно лучше сразу в соединении отбросить лишнее
6 andreymongol82
 
13.12.12
15:16
(3) Есть еще вопрос оптимизации. Так что немаловажно
7 КуплюКровать
 
13.12.12
15:16
для левой тавлицы в ГДЕ, для правой в СОЕДИНЕНИЕ
8 vii88
 
13.12.12
15:16
(5) Ок спасибо это и хотел узнать
9 vii88
 
13.12.12
15:17
(7) так и делаю, но мне кажется это не правильно
10 DrunkAnimal
 
13.12.12
15:17
(6) скл сам построит как ему нужно ... в данном случае непринциписально
11 КуплюКровать
 
13.12.12
15:18
нифига, влияет и очень сильно
12 andreymongol82
 
13.12.12
15:25
(10) Неа не построит нормально. На больших объемах это хорошо видно
13 Kashemir
 
13.12.12
15:25
Если так хочется оптимизации, лучше обе таблицы сперва порезать и поместить во временные. А тогда уже соединять. В этом случае скл уж точно не ошибется с планом запроса
14 andreymongol82
 
13.12.12
15:28
(13) Так-то да, конечно.
15 Reset
 
13.12.12
15:34
к(2) имхо местами поменять условия
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
ПО Таблица1.Поле2 = &Параметр1
И Таблица2.Поле2 = &Параметр2
И Таблица1.Поле1 = Таблица2.Поле1
16 vii88
 
13.12.12
15:39
(15) не думаю что влияе
17 Reset
 
13.12.12
16:10
Любопытства ради позапускал

ВЫБРАТЬ
   Контрагенты.Ссылка,
   Контрагенты1.Ссылка КАК Ссылка1
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
       ПО Контрагенты.ГоловнойКонтрагент = Контрагенты1.Ссылка
ГДЕ
   Контрагенты1.Код + Контрагенты.Код = Контрагенты.Код + Контрагенты1.Код


ВЫБРАТЬ
   Контрагенты.Ссылка,
   Контрагенты1.Ссылка КАК Ссылка1
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
       ПО Контрагенты.ГоловнойКонтрагент = Контрагенты1.Ссылка
           И (Контрагенты1.Код + Контрагенты.Код = Контрагенты.Код + Контрагенты1.Код)



Одинаковое время.
PostgreSQL.

Если упростить условие (намеренно делал сложное) до Контрагенты1.Код=&Параметр, выполняется быстрее, но по прежнему за равное время
18 Kashemir
 
13.12.12
16:11
(17) Ммм "выполняется быстрее, но по прежнему за равное время"
19 Goggy
 
13.12.12
16:14
(18) Это в расшифровке:
Я вроде бы не прав, но хрен когда признаюсь хД
20 Goggy
 
13.12.12
16:17
(19) А ресет, не участвовал в споре... Лана, признаю, не в тему трольнул :)
Но фраза всё равно эпичная :-Р
21 Reset
 
13.12.12
16:20
выполняется быстрее = Оба запроса выполняются быстрее
22 Reset
 
13.12.12
16:21
"Если упростить условие" = "Если упростить условие в обоих запросах"

Странно, как можно неправbльно понять. Ну ладно ;)
23 Reset
 
13.12.12
16:22
Ну еще расшифрую "за равное время" - выполняются оба запроса за равное время.
А то опять не так поймете :)
24 Reset
 
13.12.12
16:24
Равное время = Значит, выполняется за одинаковый интервал времени. Или опять непонятно?
25 Reset
 
13.12.12
17:31
Куда то сбежали вдруг ловцы на эпичных фразах.

В продолжение, в (17) можно предположить, что связь по головному свяжет контрагентов с самими собой,в массе своей, и условие на код+код1 отрезает только малую часть (реально холдинги) - поэтому разница не заметна.

Попробовал вот так

ВЫБРАТЬ
   Контрагенты.Ссылка,
   Контрагенты1.Ссылка КАК Ссылка1
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
       ПО (ПОДСТРОКА(Контрагенты.Наименование, 1, 4) = ПОДСТРОКА(Контрагенты1.Наименование, 1, 4))
           И Контрагенты.Ссылка <> Контрагенты1.Ссылка
ГДЕ
   Контрагенты1.Код + Контрагенты.Код = Контрагенты.Код + Контрагенты1.Код

Без фильтра "по коду" дает около миллиона записей, с фильтром 0. Время выполнения при переносе условия из ГДЕ в условие соединения - НЕ меняется (с учетом погрешности, разумеется).
Выходит, (5) неверно? Я не утверждаю, я интересуюсь.
Или, возможно, оно верно в каких-то ммм..сложных случаях.

Справедливости ради замечу, что (15) тоже не влияет (в этом тесте). Но чувак в (15) написал "имхо".
26 МихаилМ
 
13.12.12
17:57
все зависит от конкретной субд
для для sql92 в условия срединения ничего добавлять нельзя
в новых стандартах - все равно
хоть where хоть ON

а в (5) ерунда. т.к. SQL декларативный.

мне наглднее разделять условия объединения (join... on)
и прочие where. ораклисты используют только where

если собирать тест запрос по частям, то удобнее
условия писать вместе c указанием источника в ON
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.