问题是

Which of the following methods for providing explicit names for the columns in a view work?

a. Include a column list
b. Provide column aliases in the view SELECT statement
c. Rename the columns when you select from the view

答案

a. Works: Include a column list
b. Works: Provide column aliases in the view SELECT statement
c. Does not work: Rename the columns when you select from the view

关于(c)它们的含义是什么?“从视图中选择时重命名列”?

有帮助吗?

解决方案

我认为认证指南中的问题措辞不当。当您从视图中进行选择时,可以为列提供显式名称,这样可以:

CREATE VIEW MyView AS SELECT a, b, c FROM MyTable;
SELECT a AS d, b AS e, c AS f FROM MyView;

问题不在于明确地为列提供别名。问题在于:如果您依赖于此而不是使用不同的列名定义视图,并且视图由一个连接组成,使得列名不明确,则会遇到麻烦:

CREATE VIEW MyView AS 
  SELECT m.a, m.b, m.c, o.a, o.b, o.c 
  FROM MyTable m JOIN OtherTable o;

这不是有效视图,因为在视图定义中,所有列名称必须是不同的。例如,当您查询视图时,您会得到不明确的结果:

SELECT a FROM MyView;

这会选择第一个 a 列还是第二个 a 列?

因此,您必须在视图定义中拥有一组不同的列名,在查询视图时,这些名称与它们不同是不够的。

这就是我认为认证指南问题措辞不当的原因。它不是显式重命名列,而是确保视图的列具有不同的名称。这是重命名列的常见原因,因此编写问题的人可能就是这样写的原因。


问题中提到的其他技术都可以解决歧义:

CREATE VIEW MyView (a, b, c, d, e, f) AS 
  SELECT m.a, m.b, m.c, o.a, o.b, o.c 
  FROM MyTable m JOIN OtherTable o;

CREATE VIEW MyView AS 
  SELECT m.a, m.b, m.c, o.a AS d, o.b AS e, o.c AS f 
  FROM MyTable m JOIN OtherTable o;

无论哪种方式,您都会获得别名列:

SELECT * FROM MyView; -- returns result with columns a, b, c, d, e, f

其他提示

通过“选择时重命名”它们肯定意味着像 SELECT a AS b FROM the view 等。它不适用于“为列提供显式名称”的给定任务。是的,在视图中不需要显式的,明确的 a 来“重命名”......除非你已经通过方法(a)或(b)[[其中]消除了歧义如果您,则“重命名”这样,但这几乎是次要问题! - )]]。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top