Имя: Пароль:
1C
1С v8
Количество таблиц больше 256
0 In-Vin
 
20.06.12
14:07
Есть запрос,
ВЫБРАТЬ
   |    ВерсииОбъектов.Объект КАК Ссылка,
   |    ВерсииОбъектов.ВерсияОбъекта,
   |    ВерсииОбъектов.НомерВерсии КАК НомерВерсии,
   |    ВерсииОбъектов.ДатаВерсии,
   |    ВерсииОбъектов.АвторВерсии
   |ИЗ
   |    (ВЫБРАТЬ
   |        ВложенныйЗапрос.Объект КАК Объект,
   |        ВложенныйЗапрос.НомерВерсии КАК НомерВерсии
   |    ИЗ
   |        (ВЫБРАТЬ
   |            ВерсииОбъектов.Объект КАК Объект,
   |            СУММА(ВерсииОбъектов.НомерВерсии) КАК НомерВерсии,
   |            ВерсииОбъектов.Объект.Дата КАК ОбъектДата,
   |            ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии
   |        ИЗ
   |            РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
   |                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |                ПО ВерсииОбъектов.Объект.Ссылка = РеализацияТоваровУслуг.Ссылка
   |        ГДЕ
   |            ВерсииОбъектов.Объект.Дата >= &ДатаСоздания1
   |            И ВерсииОбъектов.Объект.Дата <= &ДатаСоздания2
   |        
   |        СГРУППИРОВАТЬ ПО
   |            ВерсииОбъектов.Объект,
   |            ВерсииОбъектов.ДатаВерсии,
   |            ВерсииОбъектов.Объект.Дата) КАК ВложенныйЗапрос
   |    ГДЕ
   |        ВложенныйЗапрос.НомерВерсии > 1) КАК ВложенныйЗапрос
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
   |        ПО ВложенныйЗапрос.Объект = ВерсииОбъектов.Объект
   |ГДЕ
   |    ВерсииОбъектов.Объект.Дата >= &ДатаСоздания1
   |    И ВерсииОбъектов.Объект.Дата <= &ДатаСоздания2
   |    И ВерсииОбъектов.ДатаВерсии >= &ДатаВерсии1
   |
   |УПОРЯДОЧИТЬ ПО
   |    Ссылка,
   |    НомерВерсии

при его выполнении возникает ошибка, часть описания которой выглядит так:

Построенный запрос к СУБД использует слишком много таблиц. Допустимо не более 256.
Microsoft OLE DB Provider for SQL Server: Слишком много имен таблиц в запросе. Максимально допустимое значение - 256.

8.2.12.92
SQL 2005
1 In-Vin
 
20.06.12
14:09
подскажите, в чем причина
2 Buster007
 
20.06.12
14:09
ВерсииОбъектов.Объект
вот здесь слишком много таблиц, сделай поменьше )
3 Рэйв
 
20.06.12
14:09
Не соединяй с Субконто и составными типами.
4 Ёпрст
 
20.06.12
14:09
составной тип.. чего там не ясного ?
5 zak555
 
20.06.12
14:10
что нужно получить ?
6 Stepa86
 
20.06.12
14:10
Раз из всех типов тебе нужен тока РеализацияТоваровУслуг, то замени обращение к ВерсииОбъектов.Объект на (Выразить ВерсииОбъектов.Объект КАК Документ.РеализацияТоваровУслуг)
7 Maxus43
 
20.06.12
14:10
Выразить(ВерсииОбъектов.Объект КАК Документ.РеализацияТоваровУслуг)
8 zak555
 
20.06.12
14:11
и зачем столько вложенных ?
9 Stepa86
 
20.06.12
14:12
(8)+100
10 Buster007
 
20.06.12
14:13
а запрос, кстати, вообще жестокий )
11 Stepa86
 
20.06.12
14:13
Вроде б без вложенных можно обойтись и

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |                ПО ВерсииОбъектов.Объект.Ссылка = РеализацияТоваровУслуг.Ссылка

заменить на Версии.Объект Ссылка Документ.РеализацияТоваровУслуг
12 Stepa86
 
20.06.12
14:14
как вариант: поставить 2008 скуль, там нет ошибки с 256 таблицами
13 Maxus43
 
20.06.12
14:14
(12) не вариант, зачем насиловать скуль? надо запросы писать по феншую
14 Stepa86
 
20.06.12
14:16
(13) извини, что смайлик забыл
15 unregistered
 
20.06.12
14:18
(0) Это убрать из запроса совсем: ВерсииОбъектов.Объект.Дата КАК ОбъектДата

Ты это поле во вложенном запросе не используешь. И группировка по нему бессмысленна.


ВерсииОбъектов.Объект КАК Объект
замени на
ВЫРАЗИТЬ(ВерсииОбъектов.Объект КАК Документ.реализациоТоваровУслуг) КАК Объект


Это соединение нафиг не надо:

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВерсииОбъектов.Объект.Ссылка = РеализацияТоваровУслуг.Ссылка

Замени тупо на условие:

ГДЕ ВерсииОбъектов.Объект ССЫЛКА Документ.РеализацияТоваровУслуг

И вообще запрос какой-то стрёмный. Не понял нафига тут вложенность.
16 Maxus43
 
20.06.12
14:19
(14) лучше табличку "сарказм" показывать)
17 In-Vin
 
20.06.12
14:21
так много вложенных запросов из-за того, что агрегаты глючат, помогло соединение с таблицей РеализацияТоваровИУслуг. Всем спасибо!
18 DEVIce
 
20.06.12
14:22
Вот такое ВерсииОбъектов.Объект.Ссылка - это очень плохо. Это раз. Ну и как выше писали - используй ВЫРАЗИТЬ.
19 DEVIce
 
20.06.12
14:23
(11). Нельзя так Степан менять потому что в его случае завяка идет на конкретный документ, а ты предлагаешь завязаться на все документы конкретного типа. Разницу чуешь?
20 anddro
 
20.06.12
14:25
(18) ВЫРАЗИТЬ тоже надо использовать с умом. Использование ВЫРАЗИТЬ в условии - это гораздо хуже, чем использование ССЫЛКА.
21 Stepa86
 
20.06.12
14:41
(20) Почему? Выразить не дает скулю соединятся с лишними таблицами, Ссылка получает тип - это как бэ не взаимозаменяемые вещи. да и что плохого в выразить в условии?
22 anddro
 
20.06.12
14:50
(21) посмотри на запрос на стороне sql. Речь именно про ГДЕ ***.
При использовании в условии ССЫЛКА - идет просто отбор по типу значения. А при использовании ВЫРАЗИТЬ - используется CASE для всех записей.
23 Stepa86
 
20.06.12
14:54
(22) этото понятно, но если нужно условие на Таблица.Объект.Дата , то без Выразить не обойтись, без него будет тот же case тока по всем возможным таблицам
24 anddro
 
20.06.12
15:01
(23) Если нужно условие на Таблица.Объект.Дата (естественно только по одному виду объектов), то лучше и достаточно:
Таблица.Объект ССЫЛКА *ТИП ССЫЛКИ* И Таблица.Объект.Дата = &Значение.  ВЫРАЗИТЬ в таком случае не нужно.
25 Stepa86
 
20.06.12
15:04
(24) Выразить( Таблица.Объект КАК Документ.Документ ).Дата = &Значение разве не в то же самое превратится в скуле?
26 anddro
 
20.06.12
15:07
(25) нет, не превратится, оно превратится в "ужасный" CASE, можешь проверить. Я проверял на 8.1.15, но вдруг что-то в этом мире изменилось и я уже не прав.
27 acsent
 
20.06.12
15:09
косяк здесь: Таблица.Объект.Дата
если соединяешь с таблицей документов то и значения полей оттуда бери
28 Stepa86
 
20.06.12
15:11
(26) с чего ужасный то? должно быть что то вроде

case when нечитаемыйИД Ссылка ДругойНечитаемыйИД then нечитаемыйИД.date end = &Значение

но проверять лезть нет желания
29 anddro
 
20.06.12
15:18
(28) с того, что:
1. индексы, впрочем если их нет...
2. case будет выполнен для всех записей в выборке
и мне тоже лень))
30 Stepa86
 
20.06.12
15:27
(29) 1. индексы добавят нечитабельности, но производительность попортить не должны
2. "Таблица.Объект ССЫЛКА *ТИП ССЫЛКИ* И Таблица.Объект.Дата = &Значение" тож перебором будет выполняться, ну во всяком случае это тот же case, где проверяется тип и если он нужный, то проверяется дата. И есть бооольшой подозрение, что вторая часть этого условия опять же развернется в охеренный case без ограничений по таблицам
31 sapphire
 
20.06.12
15:37
(0)
|ВЫБРАТЬ
   |    ВерсииОбъектов.Объект КАК Ссылка,
   |    ВерсииОбъектов.ВерсияОбъекта,
   |    ВерсииОбъектов.НомерВерсии КАК НомерВерсии,
   |    ВерсииОбъектов.ДатаВерсии,
   |    ВерсииОбъектов.АвторВерсии
   |ИЗ
   |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
   |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |ПО ВерсииОбъектов.Объект = РеализацияТоваровУслуг.Ссылка
   |ГДЕ    ВерсииОбъектов.Объект.Дата >= &ДатаСоздания1
   |     И РеализацияТоваровУслуг.Дата >= &ДатаСоздания1
   |     И РеализацияТоваровУслуг.Дата <= &ДатаСоздания2
32 sapphire
 
20.06.12
15:40
(31)вернет тот же набор данных, что и (0)
Очепятка тама:
   |ВЫБРАТЬ
   |    ВерсииОбъектов.Объект КАК Ссылка,
   |    ВерсииОбъектов.ВерсияОбъекта,
   |    ВерсииОбъектов.НомерВерсии КАК НомерВерсии,
   |    ВерсииОбъектов.ДатаВерсии,
   |    ВерсииОбъектов.АвторВерсии
   |ИЗ
   |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
   |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |ПО ВерсииОбъектов.Объект = РеализацияТоваровУслуг.Ссылка
   |ГДЕ    
   |       РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаСоздания1 И &ДатаСоздания2
   |     И ВерсииОбъектов.ДатаВерсии >= &ДатаВерсии1
   |     И ВерсииОбъектов.НомерВерсии>1
33 anddro
 
20.06.12
16:01
(30) Победил лень, проверил, и увидел, что был не прав. "Внезапно"
ВЫРАЗИТЬ - дает условие по таблице документа + left join таблицы регистра с таблицей документа. Похожий запрос в (32), но там inner join.
а вот ССЫЛКА + условие на реквизит документа как раз наоборот - дало join со всеми таблицами (где есть такой реквизит) и условие через case по каждому виду документов, т.е. условие ССЫЛКА + реквизит здесь оказалось значительно хуже.

>> И есть бооольшой подозрение ...
оно подтвердилось
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан