CftClub.ru
Клуб специалистов ЦФТ-Банк

Модификаторы ALL и COLLECTIONS в запросах

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Вечные вопросы - коллекция классики
Предыдущая тема :: Следующая тема  
Автор Сообщение
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Дек 04, 2015 10:00   Модификаторы ALL и COLLECTIONS в запросах Ответить с цитатой
Полезность: 2
Цитата:
Вопрос: Для чего нужны модификаторы all, collections и что будет, если в запросе не использовать модификатор?


Ответ: давайте напишем запрос и будем разбираться на примере.
Код:
select x(
  x:x_id
, y:y_id
, z:z_id
) in   ::[FACT_OPER] -- x - таблица без модификатора
,   (::[FACT_OPER] all :y)] collections :z)

Посмотрим, во что он трансформируется на SQL:
Код:
select  a1.ID X_ID, b1.ID Y_ID, c1.ID Z_ID
from   Z#FACT_OPER c1   -- соответствует z, модификатор collections
,   Z#FACT_OPER b1
,   Z#FACT_OPER a1      -- соответствует x, без модификатора
where c1.COLLECTION_ID is not NULL   -- это работает модификатор collections
and a1.COLLECTION_ID is NULL         -- а это условие к таблице без модификатора

Что видим?
- модификатор all: транслятор PLPLUS в SQL не умничает и не добавляет никаких дополнительных условий;
- модификатор collections: заставляет выбрать только записи с заполненным полем collection_id, то есть работает только с записями массивов;
- без модификатора: запрос использует записи с незаполненным collection_id, то есть работает только со "свободными" записями.

Следствие: если ТБП не используется как массив и в таблице нет поля collection_id, модификаторы действуют одинаково. Как только ТБП начинает использоваться как массив, в запросах сами собой появляются дополнительные условия (разумеется, для этого операция/представление должны быть перекомпилированы). Это может привести к ошибкам, но может и уберечь от них - зависит от того, какую концепцию закладывают в ТБП.

Обычно данные с незаполненными collection_id - это данные, такие же, как мы видим во всех справочниках - их нельзя удалить, если на них есть ссылки, на них можно делать ссылки.

Данные с заполненными collection_id - это данные, привязанные к владельцу, которые не существуют отдельно от владельца; на них нежелательно делать ссылки; при уничтожении владельца данные массива должны погибать вместе с ним - об этом заботятся служебные триггеры. Это НЕ справочные данные.

http://cftclub.ru/viewtopic.php?t=2776&highlight=collections

Итого, если умничанье транслятора раздражает, если не хочется разбираться, куда делись (или откуда появились лишние) данные или почему планы запросов "поехали", если хочется быть независимым от того, перекомпилируется операция или её "не заметят", используйте модификатор all и прописывайте условия явно.

PS: если в запросе используется несколько ТБП, модификатор к первому ставится последним:
Код:
select x(
  x:x_id
, y:y_id
) in   ::[FACT_OPER]
,   (::[FACT_OPER] all :y)
                               all -- модификатор к x
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Вечные вопросы - коллекция классики Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах