Добрый день коммьюнити,
Просто оставлю это здесь, чтобы самому потом не забыть как этим пользоваться)
Итак, у нас есть запрос с двумя where in или exists. В приведенном ниже примере он должен выбрать из перечня схем в SysSchema только те, UId которых есть в таблице SysModuleEntity в поле SysEntitySchemaUid и при этом сами значения SysModuleEntity должны быть в таблице SysModule и там признак IsSystem не должен быть false.
В переводе на русский: нам нужно отобрать только схемы, у которых есть пользовательские разделы, не являющиеся системными.
select *
from sysschema
where uid in (
select sysentityschemauid from sysmoduleentity
where id in (
select sysmoduleentityid from sysmodule
where issystem = 'false'
)
)
--он же, только через exists
select *
from sysschema
where exists (
select id from sysmoduleentity
where sysentityschemauid = uid and exists(
select id from sysmodule
where sysmoduleentityid = sysmoduleentity.id
and issystem = 'false'
)
)Выполнить его нужно на клиентской части и по каким-то причинам нужно выполнить только через ESQ и лучше всего одним запросом. Например, мне это было нужно, чтобы вставить свой фильтр справочного поля в уже существующий экземпляр esq вместо того, чтобы городить тонны замещающей логики.
Чтобы это выполнить, нам нужно внимательно руководствоваться вот этой великолепной статьей https://community.terrasoft.ru/articles/kak-sdelat-filtraciu-pola-po-exists-filtru-s-parametrom-znacenie-drugogo-pola и проявить немного смекалочки)
Сколько ни бейтесь у вас не выйдет сделать подобным образом:
esq.filters.addItem(Terrasoft.createExistsFilter("[SysModule:SysModuleEntity:SysEntitySchemaUId:UId].Id")а жаль, было бы удобно)
Вместо этого нам нужно сделать сразу несколько вложенных фильтров, вот так:
var subSubFilters = Terrasoft.createFilterGroup();
subSubFilters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL,
"IsSystem", false));
var subFilters = Terrasoft.createFilterGroup();
subFilters.addItem(Terrasoft.createExistsFilter("[SysModule:SysModuleEntity].Id", subSubFilters));
esq.filters.addItem(Terrasoft.createExistsFilter("[SysModuleEntity:SysEntitySchemaUId:UId].Id", subFilters));Фух, работа сделана, можно наградить себя чем-то вкусным и лучше всего очень вредным :)
А почему бы вообще не вывернуть наизнанку, написав запрос к SysModule, связанным при помощи inner join с SysModuleEntity и затем с SysSchema?
select distinct sysschema.* from sysmodule
inner join sysmoduleentity on sysmodule.sysmoduleentityid = sysmoduleentity.id
inner join sysschema on sysmoduleentity.sysentityschemauid = sysschema.uid
where issystem = 'false'
Зверев Александр,
выглядит интересно, но как это написать с помощью фильтра в esq?)
Как добавляются join разных типов, см. тут. А distinct включается в конструкторе ESQ при помощи isDistinct: true (через запятую после значения rootSchemaName).