|   |   | 
| 
 | v8: Объясните принцип ЛЕВОЕ соединение | ☑ | ||
|---|---|---|---|---|
| 0
    
        BaHgaJI 12.02.13✎ 11:25 | 
        ЛЕВОЕ соединение по идее должно выдавать всю левую таблицу и к ней уже 
  правую, в данном запросе так не происходит, выдает 980 записей хотя в левой таблице их 1000 ВЫБРАТЬ РеализацияТоваровТовары.Номенклатура, ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура1 ИЗ Документ.РеализацияТоваров.Товары КАК ИРеализацияТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары ПО РеализацияТоваровТовары.Номенклатура = ПоступлениеТоваровТовары.Номенклатура ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 | |||
| 1
    
        rbcvg 12.02.13✎ 11:26 | 
        КАК ИРеализацияТоваровТовары     | |||
| 2
    
        BaHgaJI 12.02.13✎ 11:27 | 
        (1) ошибся при копировании, запрос правильный     | |||
| 3
    
        Wobland 12.02.13✎ 11:28 | 
        не читая: а потом бах - и ГДЕ     | |||
| 4
    
        BaHgaJI 12.02.13✎ 11:28 | 
        Я понимаю если бы он больше записей выдал     | |||
| 5
    
        Humandra 12.02.13✎ 11:28 | 
        И ПоступлениеТоваровТовары.Ссылка = &Ссылка1     | |||
| 6
    
        BaHgaJI 12.02.13✎ 11:28 | 
        я понимаю что, что-то с ГДЕ, но что?     | |||
| 7
    
        BaHgaJI 12.02.13✎ 11:29 | 
        Через вложенный надо делать?     | |||
| 8
    
        shuhard 12.02.13✎ 11:29 | 
        (6) ГДЕ
  РеализацияТоваровТовары.Ссылка = &Ссылка И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 не взлетит | |||
| 9
    
        Humandra 12.02.13✎ 11:29 | 
        соединение правильное, условие неправильное. Сначала был джойн (верный), потом вы собственноручно убрали из его результата строки с ПоступлениеТоваровТовары.Ссылка есть налл     | |||
| 10
    
        Humandra 12.02.13✎ 11:31 | 
        если я верно понимаю задачу, то 
  И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 надо перенести в условие соединения | |||
| 11
    
        Широкий 12.02.13✎ 11:31 | 
        (0) А что будешь делать, в документе будет две одинаковых позиций?     | |||
| 12
    
        zhig75 12.02.13✎ 11:31 | 
        А без левого соединения тыща записей, проверял?     | |||
| 13
    
        Flyd-s 12.02.13✎ 11:31 | 
        Сначала отбирается из РеализацияТоваров.Товары, потом присоединяются строки из Документ.ПоступлениеТоваров.Товары, а потом накладываются условия     | |||
| 14
    
        BaHgaJI 12.02.13✎ 11:32 | 
        (11) не будет там ограничение на дублирование     | |||
| 15
    
        BaHgaJI 12.02.13✎ 11:32 | 
        (12) да     | |||
| 16
    
        BaHgaJI 12.02.13✎ 11:33 | 
        (10) понял, спасибо     | |||
| 17
    
        sapphire 12.02.13✎ 11:34 | 
        (16) Что ты понял?     | |||
| 18
    
        Maxus43 12.02.13✎ 11:34 | 
        (0) да убери ГДЕ и увидишь результат, наглядно     | |||
| 19
    
        MaxisUssr 12.02.13✎ 11:35 | 
        (0)
  Это условие ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 особенно строка И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 будет действовать так: 1. Система получает строку "Номенклатура" - "Номенклатура1" 2. В этой строке проверяется условие: ПоступлениеТоваровТовары.Ссылка = &Ссылка1 3. Вывод - если у тебя строка из таблицы "ПоступлениеТоваровТовары" НЕ присоединилась к таблице "РеализацияТоваровТовары" - данное условие автоматом выкидывает эту строку из таблицы. Чтобы работало, перепиши так: ВЫБРАТЬ РеализацияТоваровТовары.Номенклатура, ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура1 ИЗ Документ.РеализацияТоваров.Товары КАК ИРеализацияТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары ПО РеализацияТоваровТовары.Номенклатура = ПоступлениеТоваровТовары.Номенклатура И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка | |||
| 20
    
        Humandra 12.02.13✎ 11:39 | 
        а я бы и ГДЕ
  РеализацияТоваровТовары.Ссылка = &Ссылка перенесла в соединение нет, оптимизатор конечно и так, скорее всего, скушает и результат будет тот же но имхо, так ясно видно, что соединять надо только некоторые строки, а не всю таблицу | |||
| 21
    
        sapphire 12.02.13✎ 11:40 | 
        (20) Ну и... {недума}     | |||
| 22
    
        sapphire 12.02.13✎ 11:41 | 
        (20) И оптимизатор не при чем.     | |||
| 23
    
        Humandra 12.02.13✎ 11:44 | 
        (22) я к тому, что если бы не было оптимизатора, то сначала было бы соединение по всей таблице Документ.РеализацияТоваров.Товары
  что не есть хорошо с точки зрения производительности. и только потом наложение условия по ссылке. Но оптимизатор, чаще всего, такие ситуации разрулит сам. Правда, общетеоретически запросы не совсем эквивалентны. Но есть такое предположение, что в данном случае - результат будет одинаковый :) | |||
| 24
    
        sapphire 12.02.13✎ 11:46 | 
        (23) Ничего подобного.     | |||
| 25
    
        hhhh 12.02.13✎ 11:48 | 
        еще так можно
  ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка И (ПоступлениеТоваровТовары.Ссылка ЕСТЬ NULL ИЛИ ПоступлениеТоваровТовары.Ссылка = &Ссылка1) | |||
| 26
    
        Humandra 12.02.13✎ 11:49 | 
        (23) давайте поспорим тогда :)
  1) ЛОГИЧЕСКИ условия в ПО выполняются раньше чем ГДЕ 2) физически оптимизатору пофиг, где они будут 3) но не лучше ли явно указать, что соединяться будут только маленькие таблицы? Хотя бы для своего понимания. где я не права? | |||
| 27
    
        Humandra 12.02.13✎ 11:52 | 
        уточню: в (26) речь исключительно про запрос типа как в (0)
  потому что с inner join - оптимизатору часто (на практике видела!) не все равно | |||
| 28
    
        BaHgaJI 12.02.13✎ 11:55 | 
        (17) понял то что условием
  И ПоступлениеТоваровТовары.Ссылка = &Ссылка1 я убераю строчки из реализации которых нет в поступлении | |||
| 29
    
        pessok 12.02.13✎ 11:56 | 
        казалось бы, причем тут левое соединение?     | |||
| 30
    
        Идентификатор 12.02.13✎ 12:06 | 
        Зачем соединения, делай без них!! хД
  Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ РеализацияТоваровТовары.Номенклатура ИЗ Документ.РеализацияТоваров.Товары КАК ИРеализацияТоваровТовары ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка "; Запрос1 = Новый Запрос; Запрос1.Текст = " ВЫБРАТЬ ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура1 ИЗ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары ГДЕ ПоступлениеТоваровТовары.Ссылка = &Ссылка1 "; Структура = НовыйСтруктура("ЛевоеЗначение, ПравоеЗначение"); Для каждого строка из запрос.выполнить().выгрузить() цикл НайтиИСоединитьСЛЕВА(строка, запрос1.выполнить().выгрузить(), Структура) КонецЦикла Процедура НайтиИСоединитьСЛЕВА(Строк, табл2, труЪ) оО = Табл2.НАйти(строк.Номенклатура); Если оО = неопределено тогда Иначе труЪ.Вставить(Строк, оО); КонецЕсли КонецПроцедуры | |||
| 31
    
        Идентификатор 12.02.13✎ 12:06 | 
        п.с. не проверял :)     | |||
| 32
    
        Идентификатор 12.02.13✎ 12:09 | 
        оо, со структурой косяк :)     | |||
| 33
    
        Идентификатор 12.02.13✎ 12:12 | 
        Вот так совсем камильфо
  Пока 2*2=4 цикл Если запрос1.выполнить().выгрузить().Количество() = кол тогда прервать КОнецЕсли НайтиИСоединитьСЛЕВА(выполнить().выгрузить().Количество()[кол], запрос1.выполнить().выгрузить(), Структура) кол = кол+1; КонецЦикла | |||
| 34
    
        magicSan 12.02.13✎ 12:22 | 
        При условии "где" отбор идет из результирующей таблицы в условии "по" в отборе участвует только правая таблица(только ан неё накладываются ограничения)     | |||
| 35
    
        GANR 12.02.13✎ 12:27 | 
        ПоступлениеТоваровТовары.Ссылка = &Ссылка1 ты рубишь NULL и превращаешь левое соединение во внутреннее - банальная ошибка.     | |||
| 36
    
        smitru 12.02.13✎ 12:27 | 
        мдя-я-я... за подобное:
  Для каждого строка из запрос.выполнить().выгрузить() цикл НайтиИСоединитьСЛЕВА(строка, запрос1.выполнить().выгрузить(), Структура) КонецЦикла полагается "три года расстера без права переписки... фигачить выполнение запроса в цикле... мдя-я-я-я... | |||
| 37
    
        sapphire 12.02.13✎ 12:27 | 
        (27) О каком оптимизаторе речь? Об 1С, или СУБД?     | |||
| 38
    
        sapphire 12.02.13✎ 12:28 | 
        (28) Молодец.     | |||
| 39
    
        smitru 12.02.13✎ 12:29 | 
        (37) Ух ты.. а у 1С есть встроенный оптимизатор запросов?????
  Кинь плз ссылку на описание подобного чуда | |||
| 40
    
        GANR 12.02.13✎ 12:30 | 
        (38) интересно, сколько веток в день с ошибкой (35) можно насчитать?     | |||
| 41
    
        Идентификатор 12.02.13✎ 12:32 | 
        (36) лол што ?) почитай про итераторы :)     | |||
| 42
    
        smitru 12.02.13✎ 12:44 | 
        (41) Ты это на экзамене по спецу будешь втирать преподам, когда тебя с треском выгонят за подобный изврат..     | |||
| 43
    
        Идентификатор 12.02.13✎ 12:45 | 
        а я на экзамене по спецу такое не написал бы )     | |||
| 44
    
        Shurjk 12.02.13✎ 12:45 | 
        Однако все таки соединения для многих остаются таинственным и мистическим действом.     | |||
| 45
    
        Идентификатор 12.02.13✎ 12:46 | 
        Для каждого строка из запрос.выполнить().выгрузить() цикл
  НайтиИСоединитьСЛЕВА(строка, запрос1.выполнить().выгрузить(), Структура) КонецЦикла (42) и где же тут запрос выполняется в цикле ?) | |||
| 46
    
        Humandra 12.02.13✎ 12:48 | 
        (37) СУБД, оф коз     | |||
| 47
    
        smitru 12.02.13✎ 12:48 | 
        (45)
  а расскажи плз как ты понимаешь, что у тебя будет делать 1С когда в цикле встретит запрос1.выполнить().выгрузить() Т.е. при каждом выполнении Для каждого строка из запрос.выполнить().выгрузить() цикл У тебя будет выполняться запрос1 снова и снова... | |||
| 48
    
        Идентификатор 12.02.13✎ 13:01 | 
        (47) ах ты про это :) тогда пардон, я то говорю про
  Для каждого строка из запрос.выполнить().выгрузить() цикл | |||
| 49
    
        smitru 12.02.13✎ 13:09 | 
        (48) Конструкция 
  Для каждого строка из запрос.выполнить().выгрузить() цикл имхо, яркий пример было-кода :-) У тебя Запрос.Выполнить() может быть пустой.. тогда зачем нужны издержки на всё остальное??? почему не сделать по-нормальному.... Результат = запрос.выполнить(); Если Результат.Пустой() тогда .................... КонецЕсли; | |||
| 50
    
        Sorm 12.02.13✎ 13:11 | 
        (0) Запомните уже - условие соединения на правую таблицу превращает левое соединение во внутреннее...     | |||
| 51
    
        magicSan 12.02.13✎ 13:13 | 
        этож где надо работать чтоб придумать такую замену запросу ...     | |||
| 52
    
        trad 12.02.13✎ 13:14 | 
        (50) условие условию рознь     | |||
| 53
    
        Идентификатор 12.02.13✎ 13:15 | 
        (49) быДло - код :))
  ну будет пустой, что ж с того :) принципиальной разницы не вижу кроме имхо ) Ко всему ты придерешься ))) Да и если ты не заметил, то весь код выше приведен мною - ярки пример как раз таки быдло кода и написан исключительно для фана, как впрочем и половина сообщений на мисте ) | |||
| 54
    
        Sorm 12.02.13✎ 13:16 | 
        (52) Согласен, но здесь все прозрачно.     | |||
| 55
    
        Идентификатор 12.02.13✎ 13:27 | 
        а (0) внимательно почитай http://1cexpo.ru/obuchenie-1s-predpriyatie/23-prakticheskoe-ispolzovanie-zaprosov-v-1s-8/46-soedinenie-zaprosov.html, доступно и понятно написано     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |