Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объединение таблиц


Александр ©   (2009-06-02 12:32:00) 

Уважаемые Мастера! Имеются две таблицы в БД. В первой храняться данные в виде кодов, вторая - кодификатор (соответствие кодов строкам).
Запрос:

Select kod, count(*) from tabl
group by kod

прекрасно выплняется. Я получаю сколько раз тот или иной код встречался в таблице БД. Теперь я хочу, чтобы вместо кодов выводилась их расшифровка из другой таблицы

select (select text from kodif where kodif.kod=tabl.kod), count(*) from tabl
group by kod

а вот это не работает, хотя подобный запрос в БД Oracle проходит на ура. Подскажите можно ли в IB реализовать этот запрос.


ANB   (2009-06-03 18:25:00) [1]


> Игорь Шевченко ©   (03.06.09 14:49) [16]

Вообще то да - вижу сам, что должно проходить.
Но, милин, насколько коряво . . .


Игорь Шевченко   (2009-06-03 14:49:00) [2]


> Ой чето сомневаюсь я.


по синтаксису проходит, не сомневайся.

foo@ora11> create table kodif (
 2    kod int,
 3    text char(10)
 4  );

Table created.

foo@ora11>
foo@ora11> create table tabl (
 2    kod int
 3  );

Table created.

foo@ora11> select (select text from kodif where kodif.kod=tabl.kod), count(*) from tabl
 2  group by kod;

no rows selected


ANB   (2009-06-03 14:35:00) [3]


> Начнем флейм ? Развернем зеленое знамя Пророка ?

Да запинаем мы его :)


> хотя подобный запрос в БД Oracle проходит на ура.

Ой чето сомневаюсь я.


Игорь Шевченко   (2009-06-02 21:08:00) [4]

turbouser ©   (02.06.09 19:43) [13]


> лучше все-таки использовать явные join-ы


Начнем флейм ? Развернем зеленое знамя Пророка ?


turbouser   (2009-06-02 19:43:00) [5]


> Александр ©   (02.06.09 13:56) [10]


> И это хорошо. Спасибо.

не совсем... лучше все-таки использовать явные join-ы


AndreyV   (2009-06-02 14:41:00) [6]

> [8] Александр ©   (02.06.09 13:46)
> select a.code,b.name,count(*)
> from code_table a, name_table b
> where a.code = b.code
> group by a.code,b.name
>
> Это тоже работает. Только немного изменилась сортировка

group by и не обязан сортировать, и вообще каждый раз может выдать результат в разном порядке.


Вариант   (2009-06-02 13:57:00) [7]


> Sergey13 ©   (02.06.09 13:32) [7]

Согласен, при определенных условиях (неуникальности строкового поля) надо так как в [7]. А при других - достаточно  [5] или [2]. Данных-то о справочнике нет. Потому и высказано было предположение о справочнике и на его основе дан вариант.


Александр   (2009-06-02 13:56:00) [8]

select count(*),b.name from code_table a, name_table b where a.code = b.code
group by b.name

И это хорошо. Спасибо.


Sergey13   (2009-06-02 13:53:00) [9]

> [8] Александр ©   (02.06.09 13:46)
> Только немного изменилась сортировка

Я бы удивился если бы этого не произошло. 8-)
Это означало бы, что твои коды совпадают с наименованием по значению для сортировки.
Отсортируй явно как хочется.


Александр   (2009-06-02 13:46:00) [10]

select a.code,b.name,count(*)
from code_table a, name_table b
where a.code = b.code
group by a.code,b.name

Это тоже работает. Только немного изменилась сортировка


Sergey13   (2009-06-02 13:32:00) [11]

> [2] Вариант   (02.06.09 13:04)
> Исходя из того, что  и строковые значения в справочнике
> скорее  всего уникальны

ИМХО это слишком смелое предположение. Сам пару раз натыкался на этот "глюк".
С тех пор предпочитаю все таки включать и код и наименование в группировку.

select a.code,b.name,count(*)
from code_table a, name_table b
where a.code = b.code
group by a.code,b.name


Александр   (2009-06-02 13:26:00) [12]

SELECT k.text,count(*)  FROM tabl as t
left join
kodif as k on k.kod=t.kod
group by k.text

А вот это работает. Спасибо.


Игорь Шевченко   (2009-06-02 13:20:00) [13]

select count(*),b.name from code_table a, name_table b where a.code = b.code
group by b.name

?


turbouser   (2009-06-02 13:17:00) [14]


> Александр ©   (02.06.09 13:11) [3]

Вообще-то принято указывать версию субд


Александр   (2009-06-02 13:11:00) [15]

Не проходит. Сообщение: Token unknown 1


Вариант   (2009-06-02 13:04:00) [16]

Предлагаю такой вариант:
Исходя из того, что  и строковые значения в справочнике скорее  всего уникальны
заменим group by kod
на group by text и сделаем обычное левое объединение

SELECT k.text,count(*)  FROM tabl as t
left join
kodif as k on k.kod=t.kod
group by k.text


turbouser   (2009-06-02 12:50:00) [17]

group by 1


Наверх

Титульная страница Поиск, карта сайта Написать письмо