Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

Проблема с count(*) в joined запросе 


EternalWonderer   (2001-12-24 17:20) [0]

Уважаемые Мастера - занатоки SQL! Имеется на первый взгляд несложная задача:

Дано: таблицы CATALOG(ID,CAPTION) и LIST(ID_CAT,OTHER_FIELDS).
LIST.ID_CAT ссылается на CATALOG.ID.
Задача: составить запрос, который выведет ВСЕ строки CATALOG,
в каждой из которых (в столбце COUNTS) будет количество соответствующих им строк из LIST. Если в LIST нет соответствующих строк, должен быть выведен 0 или null.
Варианты решения:
1.select c.ID,c.CAPTION,count(*) COUNTS
from CATALOG c, LIST l
where c.id=l.TYPE_SI(+)
group by c.ID,c.CAPTION;
не потянет, поскольку в строках, которым не соответствует ни одна строка LIST (по условию задачи должен быть 0 или null), прописывается (и совершенно правильно) "1";
2.select c.ID,c.CAPTION,count(*) COUNTS
from CATALOG c, LIST l
where c.id=l.TYPE_SI
group by c.ID,c.CAPTION;
тоже не потянет, поскольку строки CATALOG, ссылок на которые нет в LIST, не будут выведены;

Как быть? Заранее спасибо.



Kapusto   (2001-12-24 17:43) [1]

А почему бы не использовать LEFT JOIN?



Mick   (2001-12-24 17:48) [2]


Select c.ID, c.CAPTION,count(ID_CAT) COUNTS
from CATALOG C, LIST L
where C.Id = L.TYPE_SI(+)
group by c.ID,c.CAPTION



Mick   (2001-12-24 17:50) [3]

Всего лишь тонкие отличия команд Count(*) и Count(FieldName)



Yuvich   (2001-12-24 18:13) [4]

> EternalWonderer
Мне непонятно одно: при чем здесь l.type_si? ведь для list внешний ключ - l.id_cat - потому и не тянет вариант 1.



VVP   (2001-12-24 19:45) [5]

select C.ID, C.CAPTION, (select count(*) from LIST where ID_CAT=C.ID)
from CATALOG C



Mick   (2001-12-25 08:46) [6]

>Yovich
"Type_SI" взялся из самого вопроса, я его скопировал.

Правильно будет конечно же так:
Select C.ID, C.CAPTION,Count(ID_CAT) COUNTS
from CATALOG C, LIST L
where C.ID = L.ID_CAT(+)
group by C.ID,C.CAPTION



Vadim   (2001-12-25 08:58) [7]

А чтобы выводился не 0 а null, можно сделать так:

Select C.ID, C.CAPTION, COUNTS
from CATALOG C, (select ID_CAT,count(*) COUNTS
from LIST group by ID_CAT)
where C.ID = ID_CAT(+)



Mick   (2001-12-25 09:05) [8]

>Vadim

Тогда уж так, памятуя, что это все же Oracle
Select C.ID, C.CAPTION,Decode(Count(ID_CAT),0,NULL,Count(ID_CAT)) COUNTS
from CATALOG C, LIST L
where C.ID = L.ID_CAT(+)
group by C.ID,C.CAPTION




EternalWonderer   (2001-12-25 09:32) [9]

Огромное спасибо, особенно Mick"у.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.023 c
7-90390           Andrei                2001-10-17 10:08  2002.01.28  
Помогите: необходима эмуляция поведения мыши


14-90360          ddd-numerical TV      2001-11-29 07:06  2002.01.28  
ACTIVE LIST


6-90338           Nemo                  2001-10-29 09:27  2002.01.28  
Тонууу..уу, SOS...SOS!!!!! Delphi mans, help me пожалуйста


1-90294           Vasilii               2002-01-08 10:19  2002.01.28  
Вызов консольного приложения


4-90411           Cobalt                2001-11-27 23:42  2002.01.28  
Exe, dll и все-все-все..., или