powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос
11 сообщений из 11, страница 1 из 1
Запрос
    #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
Запрос
    #32303195
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вот прям так и напиши. ничего не плохого для fox-а в твоем запросе нет.
...
Рейтинг: 0 / 0
Запрос
    #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
Запрос
    #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
Запрос
    #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
Запрос
    #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
Запрос
    #32303310
pako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vklepko
Насчет плана знаю, я в принципе.
EXISTS тоже не работает, когда >1 таблицы

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

>crip
1 вариант пробовал, нне проходит.
2 вариант - он будет работать очень долго, но сейчас еще посмотрю.
Не хочется циклы делать
...
Рейтинг: 0 / 0
Запрос
    #32303323
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 вариант - он будет работать очень долго, но сейчас еще посмотрю
Откуда такая информация? Все зависит от того как построены индексы...
...
Рейтинг: 0 / 0
Запрос
    #32303329
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой Fox?
Номер/текст сообщения об ошибке?
...
Рейтинг: 0 / 0
Запрос
    #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
Запрос
    #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
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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