oracle:你能为from子句分配一个别名吗?

Sin*_*tic 10 sql oracle table-alias

你能为from子句分配一个别名吗?喜欢:

select a - b "Markup" from retail a, cost b;
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉,我输入的速度有点过快,并试图将问题简化到没有任何意义的地步

我实际上想要做的是使用别名来比较同一个表中两个发布日期之间的月份.这是我发现的作品:

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
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

但那不起作用

OMG*_*ies 16

是的,Oracle支持表别名.它支持ASSELECT列表中,但不在FROM名单:

SELECT a.col - b.col AS markup
  FROM RETAIL a,
       COST b
 WHERE b.id = a.id
Run Code Online (Sandbox Code Playgroud)

大多数数据库都支持省略AS关键字.

也就是说,表别名不是列别名 - 您仍然需要引用SELECT子句中相应表中的特定列,就像您在我的示例更新中看到的那样.我还添加了WHERE标准,因此查询不会返回笛卡尔积.

派生表/内联视图有时需要表别名(AKA子查询,但我发现术语非常模糊):

SELECT x.col
  FROM (SELECT t.col,
               MAX(t.date)
          FROM TABLE t
      GROUP BY t.col) x
Run Code Online (Sandbox Code Playgroud)

这是您的查询:

你的问题是你把表别名放在派生表中,当它需要在括号/括号之外时:

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
Run Code Online (Sandbox Code Playgroud)

你需要独特的原因是因为笛卡尔积.