Query: 2 присоединенные таблицы 1:n
Задача: отобрать номенклатуры, которые
1) есть в строках заказов с ценой = 10
2) есть в строках закупок с ценой = 20
На справочнике номенклатур строим стандартный фильтр: цепляем к картотеке номенклатур строки заказа и строки закупки. Добавляем фильтры:
Строки заказа, Цена/ед., "10"
Строки закупки, Цена/ед., "20"
Т.о. у нас к одной таблице присоединены 2 со связями 1:n и с фильтром по ним. Я не знаю, как программно строить такие запросы.
Стандартный фильтр работает. Смотрим через мониторинг SQL запросов, что он строит:
------------------
SELECT
<куча полей>
FROM INVENTTABLE A(NOLOCK) ,INVENTTABLEMODULE B(NOLOCK) ,INVENTTABLEMODULE C(NOLOCK) ,INVENTTABLEMODULE D(NOLOCK) ,INVENTITEMLOCATION E(NOLOCK) WHERE (A.DATAAREAID='fin') AND ((B.DATAAREAID='fin') AND ((B.MODULETYPE=1) AND (A.ITEMID=B.ITEMID))) AND ((C.DATAAREAID='fin') AND ((C.MODULETYPE=0) AND (A.ITEMID=C.ITEMID))) AND ((D.DATAAREAID='fin') AND ((D.MODULETYPE=2) AND (A.ITEMID=D.ITEMID))) AND ((E.DATAAREAID='fin') AND ((E.INVENTDIMID=' Axapta') AND (A.ITEMID=E.ITEMID))) AND
EXISTS (SELECT 'x' FROM SALESLINE F(NOLOCK)
WHERE ((F.DATAAREAID='fin') AND ((F.SALESPRICE=1.E1) AND (A.ITEMID=F.ITEMID))) AND
EXISTS (SELECT 'x' FROM PURCHLINE G(NOLOCK) WHERE ((G.DATAAREAID='fin') AND ((G.PURCHPRICE=2.E1) AND (A.ITEMID=G.ITEMID)))))
ORDER BY A.DATAAREAID,A.ITEMID OPTION(FAST 1,LOOP JOIN)
------------------
Видим 2 вложенных подзапроса.
Вопрос: как такое построить программно, используя Query?
|