Вход | Регистрация



Условие по временной таблицы

Условие по временной таблицы
Я
   Diablo_007
 
11.10.18 - 12:39
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВтНом
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВтНом)

Есть возможность как-то поставить условие на временную таблицу или необходимо делать так?:

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка)

Если я хочу в нескольких пакетах использовать то, что у меня в условии, как правильно сделать?
 
 
   piter3
 
1 - 11.10.18 - 12:40
масло масляное)))
   Diablo_007
 
2 - 11.10.18 - 12:40
(1) Это для примера.
   aleks_default
 
3 - 11.10.18 - 12:41
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка
ИЗ
    ВтНом КАК Вт)
   1Сергей
 
4 - 11.10.18 - 12:45
(2) с соединениями плохо знаком?
   xXeNoNx
 
5 - 11.10.18 - 12:47
(3) фи...
   xXeNoNx
 
6 - 11.10.18 - 12:47
(4) я тож за внутреннее соединение
   piter3
 
7 - 11.10.18 - 12:47
(2) плохой пример
   Diablo_007
 
8 - 11.10.18 - 12:47
(3) Оо, Логично, спасибо большое)
   xXeNoNx
 
9 - 11.10.18 - 12:49
(8) не делай так!!!
   Diablo_007
 
10 - 11.10.18 - 12:53
(9) Почему?))
 
 Рекламное место пустует
   xXeNoNx
 
11 - 11.10.18 - 12:55
(10) выборка в секции ГДЕ - это УГ
   Diablo_007
 
12 - 11.10.18 - 12:57
А как еще ограничить? Ну не хочется делать 1ый запрос, выгружать данные, а потом делать 2ой запрос, чтобы вставить туда данные из 1ого запроса. не думаю, что этот вариант будет лучше
   azernot
 
13 - 11.10.18 - 13:04
(11) А что лучше

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка
ИЗ
    ВтНом КАК Вт)



ИЛИ

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтНом КАК Вт
     ПО ВтНом.Ссылка = Номенклатура.Ссылка

?
   Diablo_007
 
14 - 11.10.18 - 13:11
(13) А Это риторический вопрос? А то я не знаю) Но мне кажется, что во втором случае, он сначала выберет всю номенклатуру, а только после этого всю эту номенклатуру, которая есть в базе, а потом будет ее соединять, а в первом случае, на момент выборки он сразу будет проверять на условие вхождения. Плюс у меня оборотные регистры, и я накладываю отбор в регистре, а если я буду делать к этому регистру внутренее соединение, мне кажется, работать будет дольше.. Исправьте, если ошибаюсь. Если есть ГУРУ Скуля, с радостью выслушаю подробности работы. в том числе Как накладываются условия в виртуальных таблицах
   xXeNoNx
 
15 - 11.10.18 - 13:11
(13) нуда
   VladZ
 
16 - 11.10.18 - 13:20
(0) Что-то не я понял, к  чему эти нелепые телодвижения...
   Vakhrin
 
17 - 11.10.18 - 13:21
Если оборотные регистры, то почему условие в виртуальной таблице не хочешь?

.Обороты(,, Реквизит В (Выбрать Элемент ИЗ ВТ))
   azernot
 
18 - 11.10.18 - 13:21
(14) (15) Это вопрос. Реальный. Что лучше?  
Условие ГДЕ В (ЗапросКВТ) или внутреннее соединение с этим ЗапросКВТ?

Я как-то думал, что Условие ГДЕ В (ЗапросКВТ) оптимальнее внутреннего соединения.
   1Сергей
 
19 - 11.10.18 - 13:22
(18) в общем случае нет
   Diablo_007
 
20 - 11.10.18 - 13:25
(17) Так и сделал. Код с номенклатурой для примера был. Вот конечный запрос:

ВЫБРАТЬ
    _ДействующиеАкцииОстатки.Акция,
    _ДействующиеАкцииОстатки.ОбщееКоличествоОстаток,
    _ДействующиеАкцииОстатки.КоличествоНаКлиентаОстаток,
    _ДействующиеАкцииОстатки.ДатаНачала,
    _ДействующиеАкцииОстатки.ДатаОкончания
ПОМЕСТИТЬ ВтДостАкции
ИЗ
    РегистрНакопления._ДействующиеАкции.Остатки(
            ,
            ДатаНачала <= &ДатаДокумента
                И ДатаОкончания >= &ДатаДокумента) КАК _ДействующиеАкцииОстатки
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    _ДвиженияПоАкциямОбороты.Акция,
    _ДвиженияПоАкциямОбороты.КоличествоОборот
ПОМЕСТИТЬ ВтИспАкции
ИЗ
    РегистрНакопления._ДвиженияПоАкциям.Обороты(
            ,
            ,
            Авто,
            Контрагент = &Контрагент
                И ПунктРазгрузки = &ПунктРазгрузки
                И Акция В
                    (ВЫБРАТЬ
                        ВтДостАкции.Акция КАК Акция
                    ИЗ
                        ВтДостАкции КАК ВтДостАкции)) КАК _ДвиженияПоАкциямОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    _ДвиженияПоАкциямОбороты.Акция,
    _ДвиженияПоАкциямОбороты.КоличествоОборот
ПОМЕСТИТЬ ВтИспАкцииВсего
ИЗ
    РегистрНакопления._ДвиженияПоАкциям.Обороты(
            ,
            ,
            ,
            Акция В
                (ВЫБРАТЬ
                    ВтДостАкции.Акция КАК Акция
                ИЗ
                    ВтДостАкции КАК ВтДостАкции)) КАК _ДвиженияПоАкциямОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВтДостАкции.Акция,
    ВтДостАкции.ОбщееКоличествоОстаток КАК ОбщееОграничение,
    ВтДостАкции.КоличествоНаКлиентаОстаток КАК КлиентОграничение,
    ВтДостАкции.ОбщееКоличествоОстаток - ЕСТЬNULL(ВтИспАкцииВсего.КоличествоОборот, 0) КАК ОбщееКоличествоОстаток,
    ВтДостАкции.КоличествоНаКлиентаОстаток - ЕСТЬNULL(ВтИспАкции.КоличествоОборот, 0) КАК ОстатокПоКлиенту
ПОМЕСТИТЬ ВтИтог
ИЗ
    ВтДостАкции КАК ВтДостАкции
        ЛЕВОЕ СОЕДИНЕНИЕ ВтИспАкции КАК ВтИспАкции
        ПО (ВтИспАкции.Акция = ВтДостАкции.Акция)
        ЛЕВОЕ СОЕДИНЕНИЕ ВтИспАкцииВсего КАК ВтИспАкцииВсего
        ПО (ВтИспАкцииВсего.Акция = ВтДостАкции.Акция)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВтИтог.Акция,
    ВтИтог.ОбщееОграничение,
    ВтИтог.КлиентОграничение,
    ВтИтог.ОбщееКоличествоОстаток,
    ВтИтог.ОстатокПоКлиенту
ИЗ
    ВтИтог КАК ВтИтог
ГДЕ
    (ВтИтог.ОбщееКоличествоОстаток > 0
            ИЛИ ВтИтог.ОбщееОграничение = 0)
    И (ВтИтог.ОстатокПоКлиенту > 0
            ИЛИ ВтИтог.КлиентОграничение = 0)
   azernot
 
21 - 11.10.18 - 13:25
(19) Хотелось бы чего-то более аргументированного обоснования. Почему в общем случае нет? А в каком случае "да"?
   Cool_Profi
 
22 - 11.10.18 - 13:26
(21) Поймай запросы в скуле и посмотри планы.
После определённого размера списка в условии В() у тебя будет фуллскан, если не хуже.
   Diablo_007
 
23 - 11.10.18 - 13:27
(22) Ну у меня в условии В будет не больше 10 позиций, я думаю, ну от силы 50. Не проблема. Но если в общем случае внутреннее соединение лучше, чем Где, то что тогда с регистрами? Условие в виртуальной таблице будет быстрее, чем внутреннее соединение?
   Cool_Profi
 
24 - 11.10.18 - 13:28
(23) "словие в виртуальной таблице будет быстрее, чем внутреннее соединение?"

Да. Опять же - лови запрос и сам поймёшь ответ.
   1Сергей
 
25 - 11.10.18 - 13:29
(23) Конечно, быстрее
   Diablo_007
 
26 - 11.10.18 - 13:30
(25) Ну вот и я помню, что быстрее, отсюда и тема пошла, просто по глупости своей не сообразил, как поставить условие на временную таблицу))


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует