Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.068 c
1-49008
Maximus
2003-01-06 21:06
2003.01.16
Run-time-компонент не хочет определяться...


3-48939
Lexa
2002-12-22 04:33
2003.01.16
DBGrid


4-49338
alvin
2002-11-27 09:16
2003.01.16
Реестр в WinAPI


1-49103
Makep
2002-12-31 03:08
2003.01.16
Цвет символов


1-49041
AlekseyK
2003-01-03 11:37
2003.01.16
StringGrid в Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский