Коррелированные подзапросы
Коррелированные подзапросы реализованы 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 |