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



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

Условие по временной таблицы
Я
   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 или кнопку "Обновить" в браузере.
Рекламное место пустует