Имя: Пароль:
1C
1С v8
Как правильнее сделать этот простой запрос? И почему
, , ,
0 D_Pavel
 
05.12.12
06:55
1. 3. 75% (3)
2. Свой вариант. 25% (1)
3. 1. 0% (0)
4. 2. 0% (0)
5. ХЗ. 0% (0)
Всего мнений: 4

Запрос упростил для понятности, на самом деле он гораздо больше.
Первый вариант:
ВЫБРАТЬ
   ПриходнаяТТН.Номер,
   ПриходнаяТТНТовары.Товар КАК Номенклатура
ИЗ
   Документ.ПриходнаяТТН.ТЧасть КАК ПриходнаяТТНТовары
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходнаяТТН КАК ПриходнаяТТН
       ПО ПриходнаяТТНТовары.Ссылка = ПриходнаяТТН.Ссылка
ГДЕ
   ПриходнаяТТН.Дата МЕЖДУ &НачПериода И &КонПериода


Второй:
ВЫБРАТЬ
   ПриходнаяТТН.Номер,
   ПриходнаяТТНТовары.Товар КАК Номенклатура
ИЗ
   Документ.ПриходнаяТТН.ТЧасть КАК ПриходнаяТТНТовары
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходнаяТТН КАК ПриходнаяТТН
       ПО ПриходнаяТТНТовары.Ссылка = ПриходнаяТТН.Ссылка
ГДЕ
   ПриходнаяТТН.Дата МЕЖДУ &НачПериода И &КонПериода
   И ПриходнаяТТНТовары.Ссылка.Дата МЕЖДУ &НачПериода И &КонПериода


Третий:
ВЫБРАТЬ
   ПриходнаяТТНТовары.Ссылка.Номер,
   ПриходнаяТТНТовары.Товар КАК Номенклатура
ИЗ
   Документ.ПриходнаяТТН.ТЧасть КАК ПриходнаяТТНТовары
ГДЕ
   ПриходнаяТТНТовары.Ссылка.Дата МЕЖДУ &НачПериода И &КонПериода
18 dmpl
 
05.12.12
08:46
А вообще, 1-й вариант лучше делать так:


ВЫБРАТЬ
   ПриходнаяТТН.Номер,
   ПриходнаяТТНТовары.Товар КАК Номенклатура
ИЗ
   Документ.ПриходнаяТТН.ТЧасть КАК ПриходнаяТТНТовары
       ЛЕВОЕ СОЕДИНЕНИЕ
   (ВЫБРАТЬ
       Ссылка,
       Номер
   ИЗ
       Документ.ПриходнаяТТН КАК ПриходнаяТТН
   ГДЕ
       ПриходнаяТТН.Дата МЕЖДУ &НачПериода И &КонПериода
   )  КАК ПриходнаяТТН
       ПО ПриходнаяТТНТовары.Ссылка = ПриходнаяТТН.Ссылка


Это на случай, если оптимизация не сработает, и сначала выполнится соединение по всем документам, и только потом будет наложено условие на период. Плюс чем меньше реквизитов выбираешь - тем быстрее работает запрос.

А при большой выборке (когда запрос хотя бы секунду исполняется) будет лучше


ВЫБРАТЬ
   Ссылка,
   Номер
ПОМЕСТИТЬ ВТДокументы
ИЗ
   Документ.ПриходнаяТТН КАК ПриходнаяТТН

ГДЕ
   ПриходнаяТТН.Дата МЕЖДУ &НачПериода И &КонПериода
;

ВЫБРАТЬ
   ПриходнаяТТН.Номер,
   ПриходнаяТТНТовары.Товар КАК Номенклатура
ИЗ
   Документ.ПриходнаяТТН.ТЧасть КАК ПриходнаяТТНТовары
   ЛЕВОЕ СОЕДИНЕНИЕ ВТДокументы КАК ПриходнаяТТН
   ПО ПриходнаяТТН.Ссылка = ПриходнаяТТНТовары.Ссылка

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


Оговорка про большую выборку связана с тем, что создание временной таблицы по времени довольно затратно (0,2-0,3 с независимо от ее размера), а потому, например, в обработчике ПриПолученииДанных() или ПриВыводеСтроки() запросы с временными таблицами лучше не использовать.

Свой вариант.
2 + 2 = 3.9999999999999999999999999999999...