Текущий архив: 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.49 MB
Время: 0.008 c