Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Про функцию EXISTS() / 11 сообщений из 11, страница 1 из 1
28.09.2009, 20:52
    #36221395
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Есть 2 таблицы: a и rf, в первой 195251 запись, во второй - 617209.
Запрос:
Код: plaintext
SELECT rf.* FROM rf,a WHERE rf.fam=a.fam AND rf.im=a.im AND rf.ot=a.ot AND rf.dr=a.dr
Выдает 4922 записи, что вполне верно.
А этот:
Код: plaintext
SELECT * FROM rf WHERE exists(SELECT rf.* FROM rf,a WHERE rf.fam=a.fam AND rf.im=a.im AND rf.ot=a.ot AND rf.dr=a.dr)
Выдает все 617209. Почему это так?
...
Рейтинг: 0 / 0
29.09.2009, 09:14
    #36221842
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
А где связь таблицы rf с подзапросом?
Смысл вообще не улавливаю. Что там должно быть?
...
Рейтинг: 0 / 0
29.09.2009, 09:37
    #36221880
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Код: plaintext
1.
SELECT * FROM rf WHERE exists(SELECT rf.* FROM rf,a WHERE rf.fam=a.fam AND rf.im=a.im AND rf.ot=a.ot AND rf.dr=a.dr)
Просматривается таблица RF.
Берем первую строку и смотрим выполняется ли условие.
Т.к. подзапрос каждый раз рассчитывается по новой, а связи подзапроса с запросом никакой нет, то соответственно записи существуют, ибо их там 4922. Условие выполняется.

Берет строку 2. Опять выполняет подзапрос и получает 4922 записи. Записи существуют, условие выполнено.

Берет строку n. Опять выполняет подзапрос и получает 4922 записи. И опять условие выполнено.

И т.д., пока не закончится таблица rf. Т.е. в итоге вы получите всю таблицу rf.
...
Рейтинг: 0 / 0
29.09.2009, 10:09
    #36221935
Tohan_ORA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
VadyЕсть 2 таблицы: a и rf, в первой 195251 запись, во второй - 617209.
Запрос:
Код: plaintext
SELECT rf.* FROM rf,a WHERE rf.fam=a.fam AND rf.im=a.im AND rf.ot=a.ot AND rf.dr=a.dr
Выдает 4922 записи, что вполне верно.
А этот:
Код: plaintext
SELECT * FROM rf WHERE exists(SELECT rf.* FROM rf,a WHERE rf.fam=a.fam AND rf.im=a.im AND rf.ot=a.ot AND rf.dr=a.dr)
Выдает все 617209. Почему это так?
Потому-что для каждой строки из основного запроса несвязанный позапрос выдает , в данном конкретном случае,хотя бы одну строку,поэтому для каждой строчки основного запроса всегда будем получать true

Видимо должно быть так
Код: plaintext
SELECT * FROM rf WHERE exists(SELECT  1  FROM a WHERE rf.fam=fam AND rf.im=im AND rf.ot=ot AND rf.dr=dr)
...
Рейтинг: 0 / 0
29.09.2009, 12:18
    #36222297
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Спасибо большое! я уже понял!
...
Рейтинг: 0 / 0
02.10.2009, 10:22
    #36228918
Бонни
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Скажите, почему выдает ошибку в запросе:
zfcacwth.date,
month(zfcacwth.date) as month,
year(zfcacwth.date) as year,
zfcacwth.fcac_RN,
zfcacwth.hourqnt as hour
from
zANK,
zFcAc left join (zfcacwth inner join zHrType on zHrType.HrType_rn = zfcacwth.HrType_rn)
on zFcAc.FcAc_RN = zfcacwth.FcAc_RN
on zFcAc.FcAc_RN = zfcacwtd.FcAc_RN
where
zFcAc.Ank_RN = zAnk.Ank_RN and
zANK.jobend = {^8888-12-31} and
zfcacwth.date between {^2009-01-01} and {^2009-01-31} and
exists ( select
zfcacwtd.date
from
zFcAc f left join (zfcacwtd left join zdaytype on zfcacwtd.daytype_rn = zdaytype.daytype_rn)
on f.FcAc_RN = zfcacwtd.FcAc_RN
where
zfcacwtd.date between {^2009-01-01} and {^2009-01-31} and
zfcacwtd.fcac_RN =zfcacwth.fcac_RN and
zfcacwtd.date = zfcacwth.date
having truancy = 0
group by zfcacwtd.date, zdaytype.daytype_rn) and
zfcacwth.fcac_RN ='01BH'
group by
zfcacwth.date,
zfcacwth.HrType_rn
;

Выдает "Error correlating fields' если в подлапросе exists() есть связка
zfcacwtd.fcac_RN =zfcacwth.fcac_RN and
zfcacwtd.date = zfcacwth.date

Такого вида вещи тоже нельзя писать при подкл. через ОДВС MVFPrD 6.01 ?
...
Рейтинг: 0 / 0
02.10.2009, 10:36
    #36228955
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Код: plaintext
1.
2.
3.
4.
5.
from
zANK,
zFcAc left join (zfcacwth inner join zHrType on zHrType.HrType_rn = zfcacwth.HrType_rn)
on zFcAc.FcAc_RN = zfcacwth.FcAc_RN
on zFcAc.FcAc_RN = zfcacwtd.FcAc_RN
На каком языке написано? на tSQL структура совершенно непохожа.
...
Рейтинг: 0 / 0
02.10.2009, 10:52
    #36228996
Бонни
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Бр.. посл строчку цитированного прошу не учитывать.Мой косяк при написании сообщения.
Без неё та же самая ошибка.
...
Рейтинг: 0 / 0
02.10.2009, 13:41
    #36229552
Бонни
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Обнаружила, что в подзапросе exists() не обрабатывается join . Если писать обычную связку по полям таблиц в where, то всё срабатывавет:
select
zfcacwth.date,
month(zfcacwth.date) as month,
year(zfcacwth.date) as year,
zfcacwth.fcac_RN,
zfcacwth.hourqnt as hour
from
zANK,
zFcAc left join (zfcacwth inner join zHrType on zHrType.HrType_rn = zfcacwth.HrType_rn)
on zFcAc.FcAc_RN = zfcacwth.FcAc_RN
where
zFcAc.Ank_RN = zAnk.Ank_RN and
zANK.jobend = {^8888-12-31} and
zfcacwth.date between {^2009-01-01} and {^2009-01-31} and
exists ( select
zfcacwtd.date
from
zfcacwtd,zdaytype
where
zfcacwtd.daytype_rn = zdaytype.daytype_rn and
zfcacwtd.date between {^2009-01-01} and {^2009-01-31} and
zFcAc.FcAc_RN = zfcacwtd.FcAc_RN and
zdaytype.truancy = 0
) and
zfcacwth.fcac_RN ='01BH'
group by
zfcacwth.date,
zfcacwth.HrType_rn
;

А так - нет:

select
zfcacwth.date,
month(zfcacwth.date) as month,
year(zfcacwth.date) as year,
zfcacwth.fcac_RN,
zfcacwth.hourqnt as hour
from
zANK,
zFcAc left join (zfcacwth inner join zHrType on zHrType.HrType_rn = zfcacwth.HrType_rn)
on zFcAc.FcAc_RN = zfcacwth.FcAc_RN
where
zFcAc.Ank_RN = zAnk.Ank_RN and
zANK.jobend = {^8888-12-31} and
zfcacwth.date between {^2009-01-01} and {^2009-01-31} and
exists ( select
zfcacwtd.date
from
zfcacwtd left join zdaytype on zfcacwtd.daytype_rn = zdaytype.daytype_rn //!!!
where
zfcacwtd.daytype_rn = zdaytype.daytype_rn and
zfcacwtd.date between {^2009-01-01} and {^2009-01-31} and
zFcAc.FcAc_RN = zfcacwtd.FcAc_RN and
zdaytype.truancy = 0
) and
zfcacwth.fcac_RN ='01BH'
group by
zfcacwth.date,
zfcacwth.HrType_rn
;

Как можно избавиться от left join и переделать подзапрос переделать так, чтоб функционал остался?
...
Рейтинг: 0 / 0
02.10.2009, 15:18
    #36229810
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select с3.date, month(с3.date) as month, year(с3.date) as year, с3.fcac_RN,с3.hourqnt as hour
from с1,с2
left join (с3 inner join с5 on с5.HrType_rn = с3.HrType_rn) on с2.FcAc_RN = с3.FcAc_RN
where  с1.Ank_RN = с2.Ank_RN and 
с1.jobend = {^ 8888 - 12 - 31 } and 
с3.date between {^ 2009 - 01 - 01 } and {^ 2009 - 01 - 31 } and
exists (
	select с7.date
	from с7 
	left join с8 on с7.daytype_rn = с8.daytype_rn
	where 
	с7.daytype_rn = с8.daytype_rn and
	с7.date between {^ 2009 - 01 - 01 } and {^ 2009 - 01 - 31 } and
	с2.FcAc_RN = с7.FcAc_RN and 
	с8.truancy =  0  
	) and
с3.fcac_RN ='01BH' 
group by с3.date, с3.HrType_rn

* перестраиваем в удобочитаемый вариант
* заменяем названия хрен запомнишь в легкозапоминаемые
*zANK - с1
*zFcAc - с2
*zfcacwth - с3
*zHrType - с5
*zfcacwtd - с7
*zdaytype - с8
зачем left join? если у вас все одно в select только таблица с3!
в подзапросе:
left join с8 on с7.daytype_rn = с8.daytype_rn, зачем писать еще в where с7.daytype_rn = с8.daytype_rn? Это же противоречие.

с8.truancy = 0 ? тут же left join если строки в c8 не будет, то значение будет NULL., тода уж либо
inner join с8 on с7.daytype_rn = с8.daytype_rn where с8.truancy = 0 или
left join с8 on с7.daytype_rn = с8.daytype_rn where с8.truancy = 0 or isnull(с8.daytype_rn)
/*с8.daytype_rn взял т.к. это ключевое поле, вдруг truancy может принимать значения NULL*/

*group by с3.date, с3.HrType_rn - а зачем group by ?
...
Рейтинг: 0 / 0
02.10.2009, 16:13
    #36229970
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про функцию EXISTS()
IMHO это будет правильней
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select с3.date, month(с3.date) as month, year(с3.date) as year, с3.fcac_RN,с3.hourqnt as hour
from с2
inner join с1 on с2.Ank_RN = с1.Ank_RN and с1.jobend = {^ 8888 - 12 - 31 } 
inner join join с3 on с2.FcAc_RN = с3.FcAc_RN and с3.date between {^ 2009 - 01 - 01 } and {^ 2009 - 01 - 31 } 
inner join с5 on с5.HrType_rn = с3.HrType_rn) 
where с3.fcac_RN ='01BH' and 
exists (
	select  1 
	from с7 
	left join с8 on с7.daytype_rn = с8.daytype_rn and с8.truancy =  0  
	where с7.date between {^ 2009 - 01 - 01 } and {^ 2009 - 01 - 31 } and 
	с2.FcAc_RN = с7.FcAc_RN 
	)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Про функцию EXISTS() / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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