Помощь с SQL-запросом - подзапрос с использованием INTERBASE

У меня есть следующий запрос

SELECT *
FROM
              ( select distinct
                      r1.rep_code,
                      r1.contact_id,
                      c1.Name,
                      e1.year_num,
                      e1.period_num
                   from
                      entry e1
                         join rep r1 ON e1.rep_code = r1.rep_code
                            join contact c1 on r1.contact_id = c1.contact_id
                   where
                          e1.entry_type = 'SJOB'
                      and e1.age = 0 )

Я получаю сообщение об ошибке в строке 3

Token unknown - line 3, char 15
select

Можете ли вы дать совет, кстати, я использую InterBase IBConsole!

5 ответов

Решение

По-видимому, Interbase не поддерживает производные таблицы (SELECT FROM (SELECT)). Или, по крайней мере, версию, которую вы используете (я не могу быть уверен, это было давно, так как я не работаю с Interbase). Эта функция была добавлена ​​в Firebird 2.0. У вас есть два варианта здесь:

  • Измените свой подход, чтобы вы не использовали SELECT FROM (SELECT) (производные таблицы)

    ИЛИ ЖЕ

  • Обновление до Firebird

Если у вас есть автономия для этого, вы должны окончательно выбрать вариант № 2.

Кстати, Firebird не требует, чтобы вы объявляли псевдоним для вашей производной таблицы, хотя это в конечном итоге будет необходимо, если ваша производная таблица будет СОЕДИНЕНА с другими таблицами / производными таблицами

InterBase не поддерживает производные таблицы. Но они не дают никакой выгоды для этого запроса, поэтому просто избавьтесь от него:

              select distinct
                  r1.rep_code,
                  r1.contact_id,
                  c1.Name,
                  e1.year_num,
                  e1.period_num
               from
                  entry e1
                     join rep r1 ON e1.rep_code = r1.rep_code
                        join contact c1 on r1.contact_id = c1.contact_id
               where
                      e1.entry_type = 'SJOB'
                         and e1.age = 0 

... даст вам те же результаты, что и производная таблица в этом случае..

Вам нужно дать подзапросу псевдоним.

SELECT *
FROM
          ( select distinct
                  r1.rep_code,
                  r1.contact_id,
                  c1.Name,
                  e1.year_num,
                  e1.period_num
               from
                  entry e1
                     join rep r1 ON e1.rep_code = r1.rep_code
                        join contact c1 on r1.contact_id = c1.contact_id
               where
                      e1.entry_type = 'SJOB'
                  and e1.age = 0 ) AS tbl
SELECT *
FROM
              ( select distinct
                      r1.rep_code,
                      r1.contact_id,
                      c1.Name,
                      e1.year_num,
                      e1.period_num
                   from
                      entry e1
                         join rep r1 ON e1.rep_code = r1.rep_code
                            join contact c1 on r1.contact_id = c1.contact_id
                   where
                          e1.entry_type = 'SJOB'
                      and e1.age = 0 ) AS TABLE1

Я получил эту ошибку:

# 1248 - У каждой производной таблицы должен быть свой псевдоним

попробуйте что-то вроде:

SELECT *
FROM
              ( select distinct
                      r1.rep_code,
                      r1.contact_id,
                      c1.Name,
                      e1.year_num,
                      e1.period_num
                   from
                      entry e1
                         join rep r1 ON e1.rep_code = r1.rep_code
                            join contact c1 on r1.contact_id = c1.contact_id
                   where
                          e1.entry_type = 'SJOB'
                      and e1.age = 0 ) AS entries
Другие вопросы по тегам