![]() |
|
Реквизиты через точку в запросе. как избежать? | ☑ | ||
---|---|---|---|---|
0
Puzoter
09.01.17
✎
19:34
|
Есть запрос к документам, в котором требуется получить значения свойства реквизита документа.
Как получить значение свойства без точки? Можно через левое соединение и условием по свойству. Но в условии это свойство тоже нужно указывать через точку. Так можно делать или тоже не комильфо? |
|||
1
Cyberhawk
09.01.17
✎
19:38
|
выразить
|
|||
2
Cyberhawk
09.01.17
✎
19:38
|
И бери через точку что хочешь
|
|||
3
Cyberhawk
09.01.17
✎
19:38
|
Или тип не составной? Тогда почему через точку не хочешь?
|
|||
4
Puzoter
09.01.17
✎
19:43
|
(2) Выразить(Документ.Договор.Владелец как Справочник.Контрагенты) КАК Контрагент
Так? |
|||
5
mistеr
09.01.17
✎
19:45
|
(0) А смысл? Все одно соединение.
|
|||
6
Злопчинский
09.01.17
✎
19:45
|
(1) и ВЫРАЗИТЬ что даст? по ссылкам не будет прыгать в другие таблицы?
|
|||
7
Злопчинский
09.01.17
✎
19:46
|
(5) вот и мну этот вопрос интересен
|
|||
8
Puzoter
09.01.17
✎
19:47
|
(5) А фиг его... Может будет оптимальнее
|
|||
9
Dmitrii
гуру
09.01.17
✎
19:57
|
(4) Не очень удачный пример.
В нём ВЫРАЗИТЬ нафиг не нужно, т.к. реквизит "Владелец" скорее всего не является составным. Этот пример показателен с другой стороны. К вопросу о том зачем в документе отдельный реквизит Контрагент, когда есть Договор (контрагента можно получить в виде Владельца этого договора). То есть вроде как налицо явная информационная избыточность. Однако при внимательном рассмотрении выясняется, что этот несчастный контрагент нужен сплошь и рядом при работе с документом, а потому целесообразнее (с точки зрения производительности), когда он хранится в таблице документа в виде отдельного поля, а не получается через соединение от договора. А ВЫРАЗИТЬ имеет смысл применять к полям составного типа для ограничения количества неявных левых соединений со всеми таблицами, которые могут хранить значения этого реквизита. Например, в регистре есть измерение СчетФактура. Тип - более десятка различных ДокументСсылка.... Если ты точно знаешь, что тебе нужны, например, только документы ПоступлениеТоваров и их реквизиты (через точку), то тут как раз самое место для ВЫРАЗИТЬ(РегистрНакопления.НДСЗаписиКнигиПокупок.СчетФактура КАК Документ.ПоступлениеТоваров).НомерВходящегоДокумента |
|||
10
Dmitrii
гуру
09.01.17
✎
20:00
|
(0) >> Как получить значение свойства без точки?
Никак. Либо через точку (неявное левое соединение), либо прописывая это самое левое соединение. Еще вариант - повышение информационной избыточности путём хранения нужных тебе реквизитов в самой таблице (чтобы не получать их через точку от других реквизитов). Иногда это оправдано и имеет смысл. |
|||
11
vde69
модератор
09.01.17
✎
21:19
|
(6) любой составной тип делает джойн сначало с таблицей конфигурации (метаданных) и после этого делает джойны ко всем таблицам из по типу вне зависимости от реального типа данных.
при обычных условиях такие расходы не очень велики, но при отсутствии статистики или большого количества мелких запросов (например в динамических списках) это существенно... |
|||
12
youalex
09.01.17
✎
21:33
|
у ВЫРАЗИТЬ() есть один небольшой недостаток - оно позволяет ограничить соединения только одной таблицей.
Конечно, можно указать что то вроде ISNULL(ВЫРАЗИТЬ Заказ КАК Документ.ЗаказПокупателя).Номер, ВЫРАЗИТЬ(Заказ КАК Документ.ВнутреннийЗаказ).Номер) Но, имхо, в данном случае лучше отказаться от разыменования (поля через точку) и использовать явные соединения. COALESCE иногда (редко) тоже не хватает. |
|||
13
Злопчинский
09.01.17
✎
21:38
|
(4).(11) спсб за пояснения, так примерно и представлял
|
|||
14
mistеr
10.01.17
✎
00:53
|
(11) >любой составной тип делает джойн сначало с таблицей конфигурации (метаданных)
А подробнее можно? Как это выглядит на уровне SQL? Делать джойны с неизвестными на момент разбора запроса таблицами еще ни одна из поддерживаемых платформой СУБД не научилась. :) Я до сих пор считал, что все метаданные и имена соответствующих таблиц кэшируются при первом обращении и в дальнейшем берутся из памяти. |
|||
15
youalex
10.01.17
✎
01:38
|
(14) на уровне sql - строится соединение (ЛС) ко всем таблицам, входящим в составной тип (при ДокументСсылка - будет соединение ко всем таблицам документов)
Само поле - получается через CASE WHEN |
|||
16
Курцвейл
10.01.17
✎
05:40
|
(14) Тип данных сразу записывается в поле ИД объекта.
В метаданные лазить не нужно. |
|||
17
DrZombi
гуру
10.01.17
✎
07:30
|
(0) А чем точки мешают? :)
|
|||
18
h-sp
10.01.17
✎
07:43
|
(16) нету там типа в ид
|
|||
19
Cool_Profi
10.01.17
✎
08:57
|
(18) не в самом ид, но рядом.
|
|||
20
VladZ
10.01.17
✎
09:10
|
(0) Не врубаюсь, в чем проблема.
|
|||
21
Dotoshin
10.01.17
✎
09:19
|
(17) Ни чем не мешают, просто обращение через точку это неявное соединение. Ничего страшного в таком обращении нет, проблемы могут возникнуть, как уже писали выше, если идет обращение к реквизиту с составным типом данных.
|
|||
22
mistеr
10.01.17
✎
11:14
|
(15) Ты написал все верно, но мой вопрос был о другом.
(16) Не сам тип, а его ID. Чтобы приджойнить таблицу, в метаданные лазить нужно. |
|||
23
Dotoshin
10.01.17
✎
11:32
|
(22) Если интересно, то вот тут http://catalog.mista.ru/public/184361/
немного про составные типы написано - что происходит на уровне sql. |
|||
24
dmpl
10.01.17
✎
11:37
|
(0) Если исходный тип не составной 1 точка - нормально, оно все равно есть в выбираемой таблице. 2 точки - не очень, но зачастую нет смысла городить левое соединение (система это сделает сама не хуже, а запрос читается лучше). А вот 3 точки уже надо избегать насколько возможно.
С составными типами сложнее, там уже по результатам профилирования надо смотреть. |
|||
25
mistеr
10.01.17
✎
12:54
|
(23) Спасибо, познавательно. Кое-чего не знал.
Но в (14) я лишь хотел уточнить непонятную фразу уважаемого vde69. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |