Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.16;
Скачать: CL | DM;

Вниз

Вопрос про LEFT JOIN ...   Найти похожие ветки 

 
Karbo ©   (2002-12-18 20:09) [0]

А может быть, про Right Join или совсем не про JOIN...
Подскажите, где я ошибаюсь и кака сделать правильно. Уже задавал недавно подобный вопрос, но верного ответа - не получил.

Таблица Z:
Years
-------
1941
1942
1943
1944
1945


Таблицы A,B,C:

Region Yea Town Yea Country Yea
----------- ------------- ----------------
West 1941 Moscow 1941 Russia 1942
East 1941 Kiev 1942 Limonia 1942
Nord 1942 Smolensk 1942 Brasilia 1942

Ost 1942

Пытаюсь подсчитать количество объектов по годам, надеюсь получить

Years _A _B _C
-----------------------------
1941 2 1 0
1942 2 2 3
1943 0 0 0
1944 0 0 0
1945 0 0 0


Мой запрос для этого

Select Z.Years, count (A.Y), count (B.Y), count (C.Y)
from tableZ.db as Z
left join tableA.db as A on Z.years = A.Yea
left join tableB.db as B on Z.years = B.Yea
left join tableC.db as C on Z.years = C.Yea group by Z.Years


...и получаю совсем не то, что надо, а вот что
Years _A _B _C
-----------------------------
1941 2 2 0
1942 12 12 12
1943 0 0 0
1944 0 0 0
1945 0 0 0


Как быть? И где косяк? Help!!!!!!!!!!!!!!


 
3JIA9I CyKA ©   (2002-12-18 21:13) [1]

Везде.


 
Anatoly Podgoretsky ©   (2002-12-18 22:48) [2]

Не может быть, слово SELECT то правильно написано и на правильном месте.


 
Karbo ©   (2002-12-19 00:13) [3]

Спасибо обоим.


 
Asderg ©   (2002-12-19 08:43) [4]

LEFT OUTER JOIN ... ON ....
вам поможет.


 
ЮЮ ©   (2002-12-19 08:51) [5]

Сколько можно повторять, что в парадоксе этого одним запросом не получить. Здесь нужны полноценные подзапросы типа
(Select ... ) s1
left join
(Select ...) s2.
В парадоксе для этого надо использовать либо временные таблицы, либо Local Views (см. Local SQL Help)


 
asderg ©   (2002-12-19 09:02) [6]

еще раз повторюсь, но с LEFT OUTER JOIN все работает. проверил на DBDesktope


 
ЮЮ ©   (2002-12-19 09:13) [7]

>asderg © (19.12.02 09:02)
Это только кажется, что работает :-) Запрос покажи !!!


 
Johnmen ©   (2002-12-19 10:12) [8]

Вот так - железно, но вряд ли в LocalSQL :
Select
Z.Years,
(select count (A.Yea) from A where Z.years = A.Yea) fa,
(select count (B.Yea) from B where Z.years = B.Yea) fb,
(select count (C.Yea) from C where Z.years = C.Yea) fc
from Z
group by Z.Years


 
asderg ©   (2002-12-19 10:14) [9]

сорри за путаницу, но оказывается не работает :))
он чего то сам по себе насчитал.. не понятно как. 8))


 
ЮЮ ©   (2002-12-19 10:51) [10]

asderg © (19.12.02 10:14)
>он чего то сам по себе насчитал.. не понятно как. 8))

Всё абсолютно понятно: перемножаются все таблцы, получается N1x..NN строк своё для каждого поля группировки и во всех столбцах одной строки одно и ьоже число. Отношение M:N называется, однако :-)

Johnmen © (19.12.02 10:12)
в LocalSQL не подставляется Z.years = A.Yea для каждой строки из Z. В результате получаются одни нули



 
Johnmen ©   (2002-12-19 10:57) [11]

>ЮЮ © (19.12.02 10:51)

Ну я так и думал, что со вложенными запросами там беда...:)


 
Karbo ©   (2002-12-19 11:06) [12]

-->asderg
Не я, считал, а Database Dectop.
Z.db:
Years
-------
1941

A.db, B.db, C.db:

Region Yea Town Yea Country Yea
----------- ------------- ----------------
West 1941 Moscow 1941 Russia 1941
East 1941 Kiev 1941 Limonia 1941

Select Z.Years, count (A.Y), count (B.Y), count (C.Y)
from Z.db as Z
left join A.db as A on Z.years = A.Yea
left join B.db as B on Z.years = B.Yea
left join C.db as C on Z.years = C.Yea group by Z.Years

Результат
Years _A _B _C
-----------------------------
1941 8 8 8


Надо
Years _A _B _C
-----------------------------
1941 2 2 2


Пример в начале - тоже подтверждаю. С именам таблиц в письме напутал - не TableZ.db, a Z.db (A.db, B.db, C.db) - волновался сильно. Но сути дела - не меняет.


 
AlexSV ©   (2002-12-19 11:13) [13]

Собственно LEFT JOIN и LEFT OUTER JOIN одного поля ягоды.
ИМХО здесь достаточно JOIN, но возможно попробовать и другой вариант:

Select Z.Years, ADB.Yea_A, BDB.Yea_B, CDB.Yea_C
from Z.db as Z
join (select Yea, count(Yea) as Yea_A
from A.db
group by Yea) ADB
on ADB.Yea = Z.years
join (select Yea, count(Yea) as Yea_B
from B.db
group by Yea) BDB
on BDB.Yea = Z.years
join (select Yea, count(Yea) as Yea_C
from C.db
group by Yea) CDB
on CDB.Yea = Z.years


 
Ina   (2002-12-19 11:18) [14]

У меня на foxpro 2.6 эта задача решается последовательно 4 запросами
(названия таблиц взяты из твоего предыдущего вопроса
Karbo © (14.12.02 12:42)
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1039858964&n=1)

select z.town,sum(iif(a.num=z.index_,1,0)) as a1;
from z,a;
into dbf tmp1;
group by z.town

select z.town,sum(iif(B.num=z.index_,1,0)) as b1;
from z,B;
into dbf tmp2;
group by z.town

select z.town,sum(iif(C.num=z.index_,1,0)) as C1;
from z,C;
into dbf tmp3;
group by z.town

select tmp1.town as ttt,sum(a1) as a,sum(b1) as b,sum(c1) as c;
from tmp1 ,tmp2,tmp3;
where tmp1.town=tmp2.town and tmp2.town=tmp3.town;
group by tmp1.town

Результат получается точно такой, как и ожидался.
Ttt A B C
Kiev 0 0 0
Sochi 0 2 0
Tomsk 0 2 1
Ufa 3 1 0

Хочу обратить внимание, что в первых трех запросах
Намеренно не использую условие “ …where z.index_= a.num …”
Для того чтобы в результате запроса включались и строки с нулевыми значениями


 
ЮЮ ©   (2002-12-19 11:19) [15]

AlexSV © (19.12.02 11:13)
Зтот запрос, без сомнений, покажет всё правильно, но на MS SQL или MS Access, но не в Local SQL :-(

Karbo © (19.12.02 11:06)
Прочти хоть один мой ответ и поймешь, почему он так считает.
Убери group by Z.Years и посмотри сколько и какие строки он возвращает :-)


 
AlexSV ©   (2002-12-19 12:07) [16]

Вот рабочий вариант из Database Dectop.

Стартовые условия
> Karbo © (19.12.02 11:06)
Создаем ARes.sql
select Yea, count(Yea) as Yea_A
from A.db
group by Yea
И соответсвенно
BRes.sql
select Yea, count(Yea) as Yea_B
from B.db
group by Yea
CRes.sql
select Yea, count(Yea) as Yea_C
from C.db
group by Yea

После чего выполняем следующий запрос:

Select Z.Years, A.Yea_A, B.Yea_B, C.Yea_C
from Z.db as Z
join ARes.sql as A
on A.Yea = Z.Years
join BRes.sql as B
on B.Yea = Z.Years
join CRes.sql as C
on C.Yea = Z.Years

Результат:

Years Yea_A Yea_B Yea_C
-----------------------------
1941 2 2 2


 
AlexSV ©   (2002-12-19 12:26) [17]

Прошу прощения, результирующий запрос все таки:

Select Z.Years, A.Yea_A, B.Yea_B, C.Yea_C
from Z.db as Z
left join ARes.sql as A
on A.Yea = Z.Years
left join BRes.sql as B
on B.Yea = Z.Years
left join CRes.sql as C
on C.Yea = Z.Years


 
ЮЮ ©   (2002-12-20 08:06) [18]

Что я и говорил: ЮЮ © (19.12.02 08:51)
"... надо использовать ... Local Views (см. Local SQL Help)"



 
Karbo ©   (2002-12-20 10:05) [19]

-->3JIA9I CyKA
-->Anatoly Podgoretsky
-->Asderg (особенно)
-->ЮЮ (особенно)
-->Johnmen (особенно)
-->AlexSV (особенно)
-->Ina (особенно)

Спасибо вам всем. С с наступающим Днем Энергетика, Рождеством и Новым Годом !


 
les ©   (2002-12-20 16:03) [20]

Ну ти distinct"и из под count"ов зачем убрал, а? Уже вроде би ответ тебе давали - во проверил под DBD и Paradox 7:

/*
Alias: WORK
LiveAnswer: FALSE
*/

select
z2.town,
count(distinct a.Name) as DevkiCount,
count(distinct b.Color) as ColorCount,
count(distinct c.Chip) as ChipCount
from
Z2
left join A on (A.Num = Z2.i)
left join B on (B.Num = Z2.i)
left join C on (C.Num = Z2.i)
where
( z2.I = a.Num )
or ( z2.I = b.num )
or ( z2.I = c.num )
group by
z2.town
order by
z2.town DESC;

И примерние таблици зачем то изменил...
А 12 ти получаеш бо 2 (с таблици A) * 2 (B) * 3(C) = 12 вот для того и distinct. A в left join по умолчания и так outer.


 
les ©   (2002-12-20 16:09) [21]

Опаньки - лажа :)
Where тут совсем не нужно - то есть вот ето -

"where
( z2.I = a.Num )
or ( z2.I = b.num )
or ( z2.I = c.num )"

нужно вообще убрать нафиг из текста запроса. Ето уже я игрался забил удалить. Sorry.



Страницы: 1 вся ветка

Текущий архив: 2003.01.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.032 c
3-48902
denis24
2002-12-20 12:42
2003.01.16
навигация в наборе данных


6-49174
k-sergey
2002-11-15 12:57
2003.01.16
Кто знает!!!!! Как отправить письмо.....только не через почтовую


3-48960
@andrew
2002-12-23 11:27
2003.01.16
ПРИВЕТ ВСЕМ! Метод Locate возвратит мне true и...


1-48985
shane54
2003-01-06 19:31
2003.01.16
Почему при старте формы срабатывает событие onChange у Edit?


6-49177
BackStabber
2002-11-17 16:52
2003.01.16
Взаимодействие с сервером по TCP/IP