|   |   | 
| 
 | Знатокам по запросам. | ☑ | ||
|---|---|---|---|---|
| 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 рулит. ВЫБРАТЬ Договоры.Ссылка, СтатусыСрезПоследних.Статус ИЗ РегистрСведений.Статусы.СрезПоследних КАК СтатусыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Договоры КАК Договоры ПО СтатусыСрезПоследних.Договор = Договоры.Ссылка ВЫБРАТЬ Договоры.Ссылка, СтатусыСрезПоследних.Статус ИЗ (ВЫБРАТЬ Договор,Статус ИЗ РегистрСведений.Статусы.СрезПоследних) КАК СтатусыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Ссылка ИЗ Справочник.Договоры) КАК Договоры ПО СтатусыСрезПоследних.Договор = Договоры.Ссылка | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |