【问题标题】:Basic SQL union all as tmp基本 SQL union all as tmp
【发布时间】:2017-07-18 22:20:17
【问题描述】:

SQL 新手,有一个关于非常基本的 union all 语句的一般性问题。我正在看一段看起来像这样的代码:

select * 
into ConsolidatedTable 
from 
    (select * from Table1
     union all
     select * from Table2
     union all
     select * from Table3) as tmp;

是否需要'as tmp'?如果有,为什么?

谢谢!

【问题讨论】:

  • 这是一个别名。你可以给任何你选择的名字..它也可以是戴夫..但你应该确定别名
  • 谢谢Shakeer,但有必要吗?如果 'as tmp' 不存在会怎样?
  • 会抛出错误Incorrect syntax near ')'.
  • 当您拥有多个表时,别名可以消除歧义,因为您知道它来自哪个表。

标签: sql-server select sql-server-2012


【解决方案1】:

对于 SQL Server,是的,内联视图需要别名。如果省略别名,SQL Server 将抛出错误。

别名前的AS关键字是可选的,不是必需的。

(我个人的偏好是省略表/视图别名的 AS 关键字,并始终包含列别名的 AS 关键字。)


表/视图别名的 AS 关键字在 SQL Server 中是可选的。 (它不是 ANSI SQL 标准的一部分。)某些数据库(例如 Oracle)不接受表或视图别名之前的 AS 关键字,如果包含它会抛出错误。

某些数据库,例如 MySQL 和 SQL Server要求为内联视图分配别名。 在内联视图上需要别名的数据库(例如 Oracle)允许使用别名,并且分配别名允许我们限定外部查询中的列引用。由于限定列引用是我们的正常模式,因此为内联视图分配别名也是我们的正常模式,即使对于不需要它的数据库也是如此。

请注意,别名的分配与内联视图查询中UNION ALL 的使用无关

【讨论】:

  • 知道了,所以最后一行代码可以很简单:select * from Table3) tmp?
  • @Dave 是的,没错。在 SQL Server、Oracle、MySQL 等中可以始终遵循这种模式。
【解决方案2】:

tmp 被称为别名。这是强制性的,因为否则内联视图中的列(所有代码都包含在括号中)将在查询的其余部分中变得“无法访问”,因为您将无法引用它们。

可以取任何名字,仅供参考。

而且,要回答您的最后一个问题,是否有必要使用“as tmp”? - 因为这是sql server,你可以直接写别名,不用'as' - 所以) tmp就足够了。

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多