Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос / 11 сообщений из 11, страница 1 из 1
23.10.2003, 14:10
    #32303003
pako
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Здравствуйте
Как можно в Foxe написать такой запрос (запрос работает на MSSQL)
Код: plaintext
1.
2.
3.
4.
5.
     select  0 ,  365  , tbAccess.acsObject, tbDistributorPrice.ProductID, tbDistributor.ClientID,  0 , dspSumUSD 
     from tbDistributorPrice, tbAccess, tbDistributor, tbProduct, tbClient where tbDistributor.DistribID=tbDistributorPrice.DistribID 
     And tbAccess.acsType= 4  And tbAccess.EmployeeID= 365  And tbProduct.ProductID=tbDistributorPrice.ProductID  
     And tbDistributor.ClientID=tbClient.ClientID 
     And str(tbDistributorPrice.ProductID, 10 )+str(tbDistributor.ClientID)+ str(tbAccess.acsObject, 10 ) not in 
     (select str(ProductID, 10 )+str(ClientID)+str(CityID) from tbRegionSales)

Нужно именно комбинацию из 3 полей not in ...
...
Рейтинг: 0 / 0
23.10.2003, 15:33
    #32303195
andrew_Pr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
да вот прям так и напиши. ничего не плохого для fox-а в твоем запросе нет.
...
Рейтинг: 0 / 0
23.10.2003, 15:41
    #32303224
pako
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
>andrew_Pr
Есть плохое. Тут используется в not in более одной таблицы.
То же самое относится и к Exists.
Вот так работает
Код: plaintext
1.
2.
3.
4.
5.
6.
     select  0 ,  365  , tbAccess.acsObject, tbDistributorPrice.ProductID, tbDistributor.ClientID,  0 , dspSumUSD 
     from tbDistributorPrice, tbAccess, tbDistributor, tbProduct, tbClient where tbDistributor.DistribID=tbDistributorPrice.DistribID 
     And tbAccess.acsType= 4  And tbAccess.EmployeeID= 365  And tbProduct.ProductID=tbDistributorPrice.ProductID  
     And tbDistributor.ClientID=tbClient.ClientID 
     And str(tbDistributorPrice.ProductID, 10 ) not in 
     (select str(ProductID, 10 ) from tbRegionSales)

, а со всеми таблицами нет
...
Рейтинг: 0 / 0
23.10.2003, 15:59
    #32303273
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Думаю, что для MSSQL будет правильней(планы сравните), если
Код: plaintext
1.
2.
...
And str(tbDistributorPrice.ProductID, 10 )+str(tbDistributor.ClientID)+ str(tbAccess.acsObject, 10 ) not in 
     (select str(ProductID, 10 )+str(ClientID)+str(CityID) from tbRegionSales)
переписать в виде
Код: plaintext
1.
2.
3.
4.
...
 And !exists(select * from tbRegionSales 
                 where tbRegionSales.ProductID = tbDistributorPrice.ProductID
                 and tbRegionSales.ClientID = tbDistributor.ClientID
                 and tbRegionSales.CityID = tbAccess.acsObject)


На Fox-е, если на tbRegionSales есть индекс
str(ProductID,10)+str(ClientID)+str(CityID),
то скорее всего
...
Код: plaintext
1.
2.
And !exists( select * from tbRegionSales;
           where str(ProductID, 10 )+str(ClientID)+str(CityID) ==;
 str(tbDistributorPrice.ProductID, 10 ) + str(tbDistributor.ClientID)+str(tbAccess.acsObject, 10 ))
...
Рейтинг: 0 / 0
23.10.2003, 16:01
    #32303280
ЗВН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Уточни какой фокс
На восьмом синтаксис Ansii тобишь как у SQL,
только в конце строки точка с запятой


А вообще надо делать минимум 3 курсора, причем одно поле будет сцепленным
Результатирующий будет из временных курсоров

select str(tbDistributorPrice.ProductID,10)+str(tbDistributor.ClientID)+ str(tbAccess.acsObject,10) ;
from tbDistributorPrice inner join tbDistributor inner join tbAccess;
on tbDistributor.??? == tbAccess.???;
;
on tbDistributorPrice.DistribID==tbDistributor.DistribID ;
where tbAccess.acsType=4 And tbAccess.EmployeeID=365;
into cursosr CursTemp1

Несовсем понял по какому ключу связь с таблицей tbAccess

Почти уверен что "not in (select " не работает с функциями и может сравнивать с одной таблицей(временным курсором)
...
Рейтинг: 0 / 0
23.10.2003, 16:02
    #32303282
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
А если вот так?(Скобки)
Код: plaintext
1.
And (str(tbDistributorPrice.ProductID, 10 )+str(tbDistributor.ClientID)+ str(tbAccess.acsObject, 10 )) not in 
     (select str(ProductID, 10 )+str(ClientID)+str(CityID) from tbRegionSales)

Вообще-то такие запросы и в MS SQL и в VFP пишутся не так
Пример( на VFP диалекте) :
Код: plaintext
1.
2.
3.
select t1.* ;
from t1 left join t2 ;
on t1.id1 = t2.id1 and t1.id2 = t2.id2 ;
where isnull(t2.id1) 
...
Рейтинг: 0 / 0
23.10.2003, 16:11
    #32303310
pako
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
>vklepko
Насчет плана знаю, я в принципе.
EXISTS тоже не работает, когда >1 таблицы

>ЗВН
Почти уверен что "not in (select " не работает с функциями и может сравнивать с одной таблицей(временным курсором)
очень похоже
fox 8

>crip
1 вариант пробовал, нне проходит.
2 вариант - он будет работать очень долго, но сейчас еще посмотрю.
Не хочется циклы делать
...
Рейтинг: 0 / 0
23.10.2003, 16:16
    #32303323
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
2 вариант - он будет работать очень долго, но сейчас еще посмотрю
Откуда такая информация? Все зависит от того как построены индексы...
...
Рейтинг: 0 / 0
23.10.2003, 16:17
    #32303329
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Какой Fox?
Номер/текст сообщения об ошибке?
...
Рейтинг: 0 / 0
24.10.2003, 10:37
    #32303960
pako
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Добрый день.
Для решения проблемы написал процедуру.
Так как вызываю из приложения Delphi то хотел естественно одним запросом, для ADOQUERY, но похоже не получилось.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
PROCEDURE procRegSales (ownemp as Integer, nYear as Integer, nMonth as Integer, nDay as Integer)
	
	StrDate=DATE(nYear, nMonth,  01 )

	select  0  as regsaleid, ownemp as employeeid, tbAccess.acsObject as cityid, strDate as rslDate, tbDistributorPrice.ProductID, tbDistributor.ClientID,  0  as rslAmount, dspSumUSD as rslSumUsd;
	from tbDistributorPrice, tbAccess, tbDistributor, tbProduct, tbClient where tbDistributor.DistribID=tbDistributorPrice.DistribID;
	And tbAccess.acsType= 4  And tbAccess.EmployeeID=ownemp And tbProduct.ProductID=tbDistributorPrice.ProductID And tbProduct.prdShowYN; 
	And tbDistributor.ClientID=tbClient.ClientID and tbDistributor.dstNation order by tbClient.clnName, tbProduct.prdName;
	into cursor cursor1 
    
	INSERT INTO tbRegionSales (RegSaleID, EmployeeID, CityID, rslDate, ProductID, ClientID, rslAmount, rslSumUsd);
	SELECT RegSaleID, EmployeeID, CityID, rslDate, ProductID, ClientID, rslAmount, rslSumUsd from cursor1; 
	where str(CityID, 10 )+str(ProductID, 10 )+str(ClientID, 10 ) not in ;
	(SELECT str(CityID, 10 )+str(ProductID, 10 )+str(ClientID, 10 ) from tbRegionSales where rslDate=strDate)

ENDPROC


>Crip такой запрос нужен для подготовки пустого отчета для ввода продаж, поэтому нужно декартово произведение ГОРОД*КЛИЕНТ*ПРОДУКТ.
...
Рейтинг: 0 / 0
24.10.2003, 12:50
    #32304202
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
я по поводу того что долго будет работать... Быстро работать.. А если индексы по у tbRegion sales по str, то можно переписать так, должно летать...
Код: plaintext
1.
2.
3.
select t1.* ;
from t1 left join t2 ;
on str(t1.id1)+str(t1.id2)  == str(t2.id1)+str(t2.id2)
where isnull(t2.id1) 
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]