oracle: можете ли вы назначить псевдоним для предложения from? - PullRequest
8 голосов
/ 09 февраля 2011

можете ли вы назначить псевдоним предложению from?как:

select a - b "Markup" from retail a, cost b;

РЕДАКТИРОВАТЬ: извините, я набрал это слишком быстро и попытался упростить вопрос до такой степени, что это не имеет никакого смысла

Что я на самом деле пытаюсь сделатьиспользуйте псевдонимы для сравнения месяцев между двумя датами публикации в одной таблице.Вот что я нашел работы:

select distinct to_char(months_between((select distinct pubdate
                                        from books3 
                                        where pubid = 2), 
                                       (select distinct pubdate 
                                        from books3 
                                        where pubid = 4)), '99.99') "Answer"
                              from books3

Я хотел, чтобы это выглядело примерно так:

select distinct months_between(a,b)
from (select distinct pubdate 
       from books3 
       where pubid = 2 as a), 
     (select distinct pubdate 
      from books3 
      where pubid = 4 as b)

, но это не работает

Ответы [ 2 ]

15 голосов
/ 09 февраля 2011

Да, Oracle поддерживает псевдонимы таблиц. Он поддерживает AS в списке SELECT, но не в списке FROM:

SELECT a.col - b.col AS markup
  FROM RETAIL a,
       COST b
 WHERE b.id = a.id

Большинство баз данных поддерживают пропуск ключевого слова AS.

При этом псевдонимы таблиц не являются псевдонимами столбцов - вам все равно нужно сослаться на определенный столбец в соответствующей таблице в предложении SELECT, как вы видите в моем обновлении вашего примера. Я также добавил критерии WHERE, чтобы запрос не возвращал декартово произведение.

Псевдонимы таблиц иногда требуются для производных таблиц / встроенных представлений (подзапрос AKA, хотя я нахожу терминологию очень расплывчатой):

SELECT x.col
  FROM (SELECT t.col,
               MAX(t.date)
          FROM TABLE t
      GROUP BY t.col) x

Вот ваш запрос:

Ваша проблема заключалась в том, что вы помещали псевдоним таблицы в производную таблицу, когда она должна находиться за скобками / круглыми скобками:

SELECT DISTINCT TO_CHAR(MONTHS_BETWEEN(x.pubdate, y.pubdate), '99.99') AS "Answer"
 FROM (SELECT DISTINCT a.pubdate FROM BOOKS3 a WHERE a.pubid = 2) x,
      (SELECT DISTINCT b.pubdate FROM BOOKS3 b WHERE b.pubid = 4) y

Причина, по которой вам нужно отличное, - это декартово произведение.

0 голосов
/ 09 февраля 2011

Самое близкое к тому, что у вас есть, - вывести AS alias из подзапроса

select distinct months_between(a.pubdate,b.pubdate)
from (select distinct pubdate 
       from books3 
       where pubid = 2) as a ,
     (select distinct pubdate 
      from books3 
      where pubid = 4) as b;

Но, тем не менее, запрос не имеет особого смысла. Если есть 2 записи для pubid=2 и 3 для pubid=4, вы получите 6 строк в выводе ....

months_between(a1, b1)
months_between(a2, b1)
months_between(a1, b2)
months_between(a2, b2)
months_between(a1, b3)
months_between(a2, b3)

Я подозреваю, что на самом деле у вас есть какая-то группировка, так что при этом будут сравниваться записи pubid = 2 и pubid = 4 на уровне каждой книги.

select
    bookid,
    to_char(months_between(
        max(case when pubid=2 then pubdate end),
        max(case when pubid=4 then pubdate end)), '99.99') "Answer"
from books
group by bookid;
...