Имя: Пароль:
1C
 
Знатокам по запросам.
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) Кстати подзапросы можно использовать в условиях:

ГДЕ
 B.Ссылка В (ВЫБРАТЬ Ссылка ИЗ А)

ЗЫ: На сколько это оптимально/быстро не знаю :-(
18 Гений 1С
 
гуру
04.08.06
15:41
Зы, тесты показывают, что синтаксические конструкции не влияют на скорость запроса.
Сравните два запроса, оба выдают одну скорость(7 секунд) на больших объемах данных. Т.е. схема запроса в SQL рулит.

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


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