【问题标题】:oracle: can you assign an alias to the from clause?oracle:你能为 from 子句指定一个别名吗?
【发布时间】:2011-02-09 01:40:06
【问题描述】:

你能给 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)

但这不起作用

【问题讨论】:

  • pubidbooks3 上的唯一键吗?还是publishing category 或类似的?还是对publisher 记录的引用?
  • pubid 是对发布者记录的引用

标签: sql oracle table-alias


【解决方案1】:

是的,Oracle 支持表别名。它支持ASSELECT列表中,但在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

您需要独特的原因是因为笛卡尔积。

【讨论】:

  • @Sinaesthetic:已更新为别名添加 AS,但括号在我的示例中是匹配的,所以我假设您正在重写查询并缺少右括号。
  • 是的,我仔细检查以确保匹配括号,你是对的,它们是匹配的。这让我认为给出误导性错误的陈述还有其他问题。复制粘贴也没用
  • @Sinaesthetic:调试时间——取出 TO_CHAR 和 MONTHS_BETWEEN 看看是否有效。
  • 这样做:SELECT DISTINCT x.pubdate, y.pubdate FROM (SELECT DISTINCT a.pubdate FROM BOOKS3 AS a WHERE a.pubid = 2) AS x, (SELECT DISTINCT b.pubdate FROM BOOKS3 AS b WHERE b.pubid = 4) AS y;错误第 2 行——“缺少右括号”
  • @Sinaesthetic:好的,取出与y 相关的任何内容——子查询和列。然后看看是否有效。如果是,请尝试相反的操作——删除所有 x 东西并进行测试。
【解决方案2】:

最接近您所拥有的是将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;

但是,查询仍然没有多大意义。如果pubid=2 有 2 条记录,pubid=4 有 3 条记录,则输出中有 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)

我怀疑您实际上正在进行一些分组,因此这将在每个 bookid 级别比较 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;

【讨论】:

  • “SQL 命令未正确结束”。此外,碰巧每个 pubid 的每个记录都有相同的发布日期
  • 这次没有错误,虽然“答案”一栏都是空白的。但是,该对象是基于别名的想法。我已经有一个有效的查询来返回答案。只是想以不同的方式做到这一点。
  • @sin - 您尝试了哪一个或两者都尝试了?
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2012-02-03
  • 2014-01-11
  • 2015-07-10
  • 2022-06-23
  • 2015-11-19
相关资源
最近更新 更多