问题是
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)“从视图中选择时重命名列”是什么意思?
答案 0 :(得分:1)
我认为认证指南中的问题措辞不当。当您从视图中进行选择时,可以为列提供显式名称,这样可以:
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
答案 1 :(得分:0)
通过“选择时重命名”,它们肯定意味着类似SELECT a AS b FROM theview
等。它不适用于“为列提供显式名称”的给定任务的原因是不需要显式,在视图中明确a
,您可以“重命名”...除非您已经通过方法(a)或(b)[[在这种情况下您也]消除了歧义重命名“这样,但这几乎是次要问题! - )]。