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