Показать сообщение отдельно
Старый 02.03.2005, 11:11   #1  
Юлия Кузнецова is offline
Юлия Кузнецова
Участник
 
3 / 10 (1) +
Регистрация: 02.03.2005
Адрес: Санкт-Петербург
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?