Коллеги, приветствую.
Помогите, пожалуйста, с формированием кода запроса.
Я формирую таблицу, в столбец (логического типа) которой подзапросом вывожу 1 или 0 в зависимости от наличия записи в другой таблице: в дополнение к Продаже вывожу столбец, в котором отмечаю была ли эта Продажа на стадии, например, Контрактование.
При этом нужно именно значение 1 или 0.
Нашёл 2 решения в виде sql-запроса:
1. select "O"."Id", "O"."Title"
, (select exists(select 1 from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6')) AS "Contracting"
from "Opportunity" AS "O"
2. либо через count(*) делённый сам на себя
1. select "O"."Id", "O"."Title"
, coalesce(select count(*) / count(*) as "cnt" from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6') AS "Contracting"
from "Opportunity" AS "O"
Я закодировал подзапрос с одним count таким образом
var stagePresentSubSelect = new Select(userConnection).Count("*").As("cnt")
.From("OpportunityInStage", "OinS")
.Where("OinS", "OpportunityId").IsEqual("O", "Id");
Подскажите, пожалуйста, как можно добавить в код exists (не в фильтр) или деление count на себя?
Нравится
У меня на MSSQL ни первый, ни второй запросы не заработали. Что за база у Вас?
Если переписать первый так, результат будет тот же?
select "O"."Id", "O"."Title", isnull((select 1 from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6'),0) AS "Contracting" from "Opportunity" AS "O"
А с IsNull мы уже работать сможем, примерно так:
.Column(Func.IsNull(Column.SubSelect(mySubSelect), Column.Const(0)))
А по второму примеру вообще не не понял, зачем делить само на себя, там же будет либо 1, либо ошибка деления на 0.