-
Уважаемые Мастера! Имеются две таблицы в БД. В первой храняться данные в виде кодов, вторая - кодификатор (соответствие кодов строкам).
Запрос:
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 реализовать этот запрос.
-
group by 1
-
Предлагаю такой вариант:
Исходя из того, что и строковые значения в справочнике скорее всего уникальны
заменим 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
-
Не проходит. Сообщение: Token unknown 1
-
> Александр © (02.06.09 13:11) [3]
Вообще-то принято указывать версию субд
-
select count(*),b.name from code_table a, name_table b where a.code = b.code
group by b.name
?
-
SELECT k.text,count(*) FROM tabl as t
left join
kodif as k on k.kod=t.kod
group by k.text
А вот это работает. Спасибо.
-
> [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
-
select a.code,b.name,count(*)
from code_table a, name_table b
where a.code = b.code
group by a.code,b.name
Это тоже работает. Только немного изменилась сортировка
-
> [8] Александр © (02.06.09 13:46)
> Только немного изменилась сортировка
Я бы удивился если бы этого не произошло. 8-)
Это означало бы, что твои коды совпадают с наименованием по значению для сортировки.
Отсортируй явно как хочется.
-
select count(*),b.name from code_table a, name_table b where a.code = b.code
group by b.name
И это хорошо. Спасибо.
-
> Sergey13 © (02.06.09 13:32) [7]
Согласен, при определенных условиях (неуникальности строкового поля) надо так как в [7]. А при других - достаточно [5] или [2]. Данных-то о справочнике нет. Потому и высказано было предположение о справочнике и на его основе дан вариант.
-
> [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 и не обязан сортировать, и вообще каждый раз может выдать результат в разном порядке.
-
> Александр © (02.06.09 13:56) [10]
> И это хорошо. Спасибо.
не совсем... лучше все-таки использовать явные join-ы
-
turbouser © (02.06.09 19:43) [13]
> лучше все-таки использовать явные join-ы
Начнем флейм ? Развернем зеленое знамя Пророка ?
-
> Начнем флейм ? Развернем зеленое знамя Пророка ?
Да запинаем мы его :)
> хотя подобный запрос в БД Oracle проходит на ура.
Ой чето сомневаюсь я.
-
> Ой чето сомневаюсь я.
по синтаксису проходит, не сомневайся.
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
-
> Игорь Шевченко © (03.06.09 14:49) [16]
Вообще то да - вижу сам, что должно проходить.
Но, милин, насколько коряво . . .