![]() |
![]() |
![]() |
|
Знатокам по запросам. | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
04.08.06
✎
13:52
|
Есть запросы А, Б, В.
Причем запрос Б имеет вид: ВЫБРАТЬ К1, К2, К3 ИЗ В ГДЕ ... Вопрос: Мне нужен результат запроса А JOIN Б. Но как бы сделать так, чтобы этот JOIN учитывался и для таблицы В. Т.е. таблица В очень большая, нужно чтобы к ней тоже применялся JOIN, т.е. попадали только те записи, которые есть в А? Время пошло. |
|||
1
PR
04.08.06
✎
13:53
|
Пользуйся конструктором
|
|||
2
defender1
04.08.06
✎
13:54
|
LEFT JOIN
|
|||
3
Гений 1С
гуру
04.08.06
✎
14:03
|
я это и имел ввиду, запрос такой:
ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ В ГДЕ ...) КАК Б Таблица В - большая. Можно его переписать как-то типа: ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ В LEFT JOIN А ГДЕ ...) КАК Б |
|||
4
Tristan
04.08.06
✎
14:10
|
стоп стоп, ты определись... 3 запроса, или 2 объединения и обзываешь это третим (Как Б)
|
|||
5
Гений 1С
гуру
04.08.06
✎
14:14
|
Запрос такой:
ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ В ГДЕ ...) КАК Б Т.е. я думаю можно ли его оптимизировать, в (3) привел вариант, как, можно ли так сделать? |
|||
6
Гений 1С
гуру
04.08.06
✎
14:16
|
ой, пардон
ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ R ГДЕ ...) КАК В) ГДЕ ..) КАК Б |
|||
7
Гений 1С
гуру
04.08.06
✎
14:16
|
(4) Да, ты прав
|
|||
8
Tristan
04.08.06
✎
14:16
|
смотря какие условия и на что они налогаются,
ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ В LEFT JOIN А ГДЕ ...) КАК Б но вот это: ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ В LEFT JOIN А ГДЕ ...) КАК Б это вообще бессмысленный, поскольку нафига к В присоединять часть А, если потом часть В присоедениться к полной А? |
|||
9
Tristan
04.08.06
✎
14:20
|
блин, стоко букафф, баюсь не асилю ;-)
ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ R ГДЕ ...) КАК В) ГДЕ ..) КАК Б Где то скобочка потерялась одна, ну х с ней... Почему (ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ R ГДЕ ...) КАК В) ГДЕ ..) Нельзя написать как: ВЫБРАТЬ * ИЗ А LEFT JOIN (ВЫБРАТЬ * ИЗ R ГДЕ ... И ... И ...) как Б ? |
|||
10
Zoomer
04.08.06
✎
14:20
|
(8) согласен. масло масляное. можно сделать просто
ВЫБРАТЬ * ИЗ В LEFT JOIN А ГДЕ ... |
|||
11
Гений 1С
гуру
04.08.06
✎
14:21
|
(9) Потому что я написал для простоты, чувак, понимаешь. Если бы можно было просто объединить условия, было бы зашибись, но нельзя преобразовать в один запрос. Т.е. надо сначала получить запрос В, а обработав его, запрос Б, а уже потом соединять его с запросом А.
Но можно формируя запрос В, соединить таблицу R с А, для ускорения, т.к. таблица R ужасно большая |
|||
12
Tristan
04.08.06
✎
14:22
|
(10) нет, нельзя, поскольку стоит А Девое соединение В, то а должна остаться полной, просто (0) хочет какоето хитровы%^&*# условие применить к В, но никак не возьму в толк какое
|
|||
13
Tristan
04.08.06
✎
14:30
|
тьфу блин, понял, тогда вот тебе простое решение:
ВЫБРАТЬ * ИЗ А ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ А ЛЕВОЕ СОЕДИНЕНИЕ В) КАК В1 ГДЕ .........) КАК Б т.е. сначала урезаем таблицу до размеров таблицы А. Но тут надо смотреть что менее плачевно, если табл А всегда маленькая, то так быстрее, если хз, то имеет смысл все же накладывать сначала условия, а потом соединения |
|||
14
Tristan
04.08.06
✎
14:31
|
(13) ой, не то чуток
ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ А ЛЕВОЕ СОЕДИНЕНИЕ В) КАК Б ГДЕ ......... |
|||
15
AntonioS
04.08.06
✎
14:32
|
(11) ты можешь сколько угодно гадать, только решит все в итоге оптимизатор запросов SQL.
Насколько я знаю, вложенные запросы работают не по всем данным, а по тем, которые уже удалось получить/отфильтровать на верхнем уровне. Т.е. на таблицу В при выборке уже будет наложен фильтр. Однако, при больших уровнях вложенности оптимизатор не всегда ведет себя подобным образом |
|||
16
Гений 1С
гуру
04.08.06
✎
14:37
|
(15) гм, это утешает
|
|||
17
Neco
04.08.06
✎
14:41
|
(16) Кстати подзапросы можно использовать в условиях:
ЗЫ: На сколько это оптимально/быстро не знаю :-( |
|||
18
Гений 1С
гуру
04.08.06
✎
15:41
|
Зы, тесты показывают, что синтаксические конструкции не влияют на скорость запроса.
Сравните два запроса, оба выдают одну скорость(7 секунд) на больших объемах данных. Т.е. схема запроса в SQL рулит. ВЫБРАТЬ Договоры.Ссылка, СтатусыСрезПоследних.Статус ИЗ РегистрСведений.Статусы.СрезПоследних КАК СтатусыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Договоры КАК Договоры ПО СтатусыСрезПоследних.Договор = Договоры.Ссылка ВЫБРАТЬ Договоры.Ссылка, СтатусыСрезПоследних.Статус ИЗ (ВЫБРАТЬ Договор,Статус ИЗ РегистрСведений.Статусы.СрезПоследних) КАК СтатусыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Ссылка ИЗ Справочник.Договоры) КАК Договоры ПО СтатусыСрезПоследних.Договор = Договоры.Ссылка |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |