ислюваного в запиті списку об'єктів запиту умова with виконується, і вважається невиконаним, якщо знайдеться такий який вираховується в запиті список об'єктів, для якого воно не виконується. Неважко бачити, що ці дії відповідають алгебрі предикатів.
У списку фрази select вибору даних за замовчуванням визначається квантор all, згідно з яким вибираються дані всіх об'єктів, для яких виконана умова запиту. Якщо ж потрібно висновок тільки тих даних, для яких виконується умова запиту, то для вибору даних вживається квантор exist. Ця конструкція додається в мови запитів.
У розглянутому прикладі у фразі select для вибору тільки того Показника, для якого виконується умова, записується квантор exist:
select ... exist (НаіменованіеПоказателя)
Мовою SODQL запит виглядає наступним чином:
for НаименованиеТехнологическойГруппы=«Діагональні шини»,
ДатаВипуска=01.01.2010: 31.12.2010
select НаіменованіеШіни, ОбозначеніеШіни, МодельШіни, НаіменованіеСтандарта, exist (НаіменованіеПоказателя), ЗначеніеВПаспорте, НіжняяНорма, ВерхняяНорма
where exist (Показники) with ВерхняяНорма < ЗначеніеВПаспорте | ЗначеніеВПаспорте < Ниж-няяНорма
Враховуючи, що в схемі клас Показники входить в два ланцюжки, що йдуть від базового класу Шина, необхідно скласти два корельованих підзапиту для цього класу і з'єднати їх перетинанням. Після перетворення запиту в мову нижнього рівня ODQL отримаємо: for НаименованиеТехнологическойГруппы=«Діагональні шини»,
ДатаВипуска=01.01.2010: 31.12.2010
select НаіменованіеШіни, ОбозначеніеШіни, МодельШіни,
НомерПартіі, НаіменованіеСтандарта, exist (НаіменованіеПоказателя), ЗначеніеВПаспорте, НіжняяНорма, ВерхняяНорма
from Шина, ТехнологіческаяГруппа ТГ, Паспорт Пас, Стандарт Ст,
(Select object from Показники Пк, ПоказательПаспорта ПокПас links Пас contains (ПокПас) Пк) intersection
(Select object from Показники Пк, Норми Норма links Ст contains (Норм) Пк)
Пок
links ТГ contains Шина, Шина parent Пас, Ст parent Шина,
Пас contains (ПокПас) Пок, Ст contains (Норм) Пок where exist (Пок) with ВерхняяНорма < ЗначеніеВПаспорте |
ЗначеніеВПаспорте < НіжняяНорма
Виконання цього запиту визначається наступними діями:
1. Вибираємо всі об'єкти, що відповідають обмеженню з for для класів Технологічні групи та Паспорт. При цьому для класу Технологічні групи використовуємо внутрішнє включення для визначення всіх груп, вкладених в групу, яка задана умовою фрази for. Для решти класів Шина, Стандарт, Показники, Показник Паспорти, Норми продукції встановлюємо позначку MarkList всіх вибраних об'єктів.
2. Приступаємо до корекції позначок об'єктів класів. По фразі links визначаємо пов'язаний з цим класом ставленням включення включає клас Шина. Йдемо знизу вгору від об'єктів класів Технологічні групи та Паспорт до об'єктів класу Шина і помічаємо ті, які пов'язані з уже поміченими об'єктами, тобто відповідають обом умовам із фрази for. На цьому етап корекції закінчується.
3. Починаємо обхід схеми шарів з базового класу Шина. Вибираємо по черзі його помічені об'єкти.
4. Для поточного вибраного об'єкту класу Шина вибираємо значення полів НаіменованіеШіни, ОбозначеніеШіни, МодельШіни і заносимо в буфер 1.
5. Для поточного поміченого об'єкту класу Шина за наступною зв'язку фрази links виб...