Коррелированные подзапросы
Коррелированные подзапросы реализованы DaJet Script согласно стандартному SQL. Если коротко, то это запросы, которые могут ссылаться на результаты своего родительского запроса. Можно сказать, что коррелированные подзапросы - это встроенные в основной запрос функции (inline functions), использующие замыкание (closure) на родительскую область видимости данных. Обычно такие функции возвращают скалярное значение, однако, могут возвращать и массивы скалярных значений, например, при использовании в предложении WHERE такими функциями сравнения, как IN или EXISTS.
Более подробно можно ознакомиться с особенностями и использованием коррелированных подзапросов в документации по стандартному
SQLсоответствующей СУБД, например, Microsoft SQL Server или PostgreSQL.
В ниже следующем примере обратите внимание на то, каким образом подзапрос получает значение реквизита Наименование из таблицы Справочник.Номенклатура для поля выборки Товар в предложении SELECT основного запроса, ссылаясь на поле Номенклатура таблицы РегистрСведений.ЦеныНоменклатуры через её псевдоним Цены:
WHERE Ссылка = Цены.Номенклатура -- Ссылка на результат родительского запроса
Во втором случае подзапрос используется в предложении WHERE основного запроса и теоретически мог бы вернуть несколько значений реквизита Ссылка из таблицы Справочник.Номенклатура, если бы код товара имел дубликаты.
DECLARE @table array
DECLARE @КодТовара string = '00000001'
USE 'mssql://server/database'
SELECT Период
, Товар = (SELECT Наименование
FROM Справочник.Номенклатура
WHERE Ссылка = Цены.Номенклатура)
, Цена
INTO @table
FROM РегистрСведений.ЦеныНоменклатуры AS Цены
WHERE Номенклатура IN (SELECT Ссылка
FROM Справочник.Номенклатура
WHERE Код = @КодТовара)
ORDER BY Период ASC
END
IF @table = NULL
THEN RETURN 'Нет данных'
ELSE RETURN @table
END
Результат запроса в DaJet Studio
| Период | Товар | Цена |
|---|---|---|
| 01/01/2024 00:00:00 | Товар 1 | 1.00 |
| 01/02/2024 00:00:00 | Товар 1 | 1.23 |
| 01/03/2024 00:00:00 | Товар 1 | 3.21 |