Конференция "Базы" » Объединение таблиц
 
  • Александр © (02.06.09 12:32) [0]
    Уважаемые Мастера! Имеются две таблицы в БД. В первой храняться данные в виде кодов, вторая - кодификатор (соответствие кодов строкам).
    Запрос:

    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 реализовать этот запрос.
  • turbouser © (02.06.09 12:50) [1]
    group by 1
  • Вариант (02.06.09 13:04) [2]
    Предлагаю такой вариант:
    Исходя из того, что  и строковые значения в справочнике скорее  всего уникальны
    заменим 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
  • Александр © (02.06.09 13:11) [3]
    Не проходит. Сообщение: Token unknown 1
  • turbouser © (02.06.09 13:17) [4]

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

    Вообще-то принято указывать версию субд
  • Игорь Шевченко © (02.06.09 13:20) [5]
    select count(*),b.name from code_table a, name_table b where a.code = b.code
    group by b.name

    ?
  • Александр © (02.06.09 13:26) [6]
    SELECT k.text,count(*)  FROM tabl as t
    left join
    kodif as k on k.kod=t.kod
    group by k.text

    А вот это работает. Спасибо.
  • Sergey13 © (02.06.09 13:32) [7]
    > [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
  • Александр © (02.06.09 13:46) [8]
    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 © (02.06.09 13:53) [9]
    > [8] Александр ©   (02.06.09 13:46)
    > Только немного изменилась сортировка

    Я бы удивился если бы этого не произошло. 8-)
    Это означало бы, что твои коды совпадают с наименованием по значению для сортировки.
    Отсортируй явно как хочется.
  • Александр © (02.06.09 13:56) [10]
    select count(*),b.name from code_table a, name_table b where a.code = b.code
    group by b.name

    И это хорошо. Спасибо.
  • Вариант (02.06.09 13:57) [11]

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

    Согласен, при определенных условиях (неуникальности строкового поля) надо так как в [7]. А при других - достаточно  [5] или [2]. Данных-то о справочнике нет. Потому и высказано было предположение о справочнике и на его основе дан вариант.
  • AndreyV © (02.06.09 14:41) [12]
    > [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 и не обязан сортировать, и вообще каждый раз может выдать результат в разном порядке.
  • turbouser © (02.06.09 19:43) [13]

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


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

    не совсем... лучше все-таки использовать явные join-ы
  • Игорь Шевченко © (02.06.09 21:08) [14]
    turbouser ©   (02.06.09 19:43) [13]


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


    Начнем флейм ? Развернем зеленое знамя Пророка ?
  • ANB (03.06.09 14:35) [15]

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

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


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

    Ой чето сомневаюсь я.
  • Игорь Шевченко © (03.06.09 14:49) [16]

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


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

    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 (03.06.09 18:25) [17]

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

    Вообще то да - вижу сам, что должно проходить.
    Но, милин, насколько коряво . . .
 
Конференция "Базы" » Объединение таблиц
Есть новые Нет новых   [134474   +34][b:0.001][p:0]