内联函数,每个视图或函数中的列名必须唯一
Posted
技术标签:
【中文标题】内联函数,每个视图或函数中的列名必须唯一【英文标题】:Inline Function, Column names in each view or function must be unique 【发布时间】:2020-02-26 12:47:34 【问题描述】:我已经加入了这两个表,现在我想将该语句保存在函数中,以便我可以再次使用它 然后再次。我尝试按如下方式创建函数:-
create function fn_electricalsem1and2()
returns table
as
return (
Select *
from [Electrical Semester 1 Regular] as T1
inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)
现在我收到错误
每个视图或函数中的列名必须是唯一的。列名 视图中的“名称”或功能“fn_electricalsem1and2”被指定更多 不止一次。
到现在我还没有做任何函数,但是为什么我得到错误函数必须是唯一的?
【问题讨论】:
Bad habits to kick : using SELECT * / omitting the column list - 顺便说一句,如果这个函数是无参数的,那么作为视图而不是函数可能更有意义。无论哪种方式,您都需要明确说明要返回的列,而不是使用SELECT *
。
一些你可能希望改掉的坏习惯 - using dashes and spaces in entity names - using table aliases like (a, b, c) or (t1, t2, t3), avoiding the schema prefix
【参考方案1】:
这是因为你的函数返回一个表,并且在一个表中所有的列名都应该是唯一的。
解决问题需要更换
Select *
到
Select t1.column1 as Col1, t1.column2, t2.column1 as Col2, ...and so on
在您的情况下,department_id
在两个表中都可用。此外,这两个表都包含一列名称:name
。
【讨论】:
我的 Select 语句是正确的,它也可以工作,但我的主要问题是我无法创建函数 @Awesome 我是说在创建函数时使用别名和列名作为 t1.name 作为 t1name,t2.name 作为 t2Name 等。它给出错误,因为函数返回一个表并且在表中所有列名都应该是唯一的。 @Awesome 我认为 select 语句返回结果集而不是表,因此在 select 中即使有多个同名列也不会给出错误。【参考方案2】:在以下查询中, 我们将首先创建表格并填充一些数据。
CREATE TABLE [Electrical Semester 1 Regular](department_id INT);
CREATE TABLE [Electrical Semester 2 Regular](department_id INT);
INSERT INTO [Electrical Semester 1 Regular]
VALUES(1);
INSERT INTO [Electrical Semester 2 Regular]
VALUES(1);
当我们执行以下查询时,您不会遇到任何错误;
Select *
from [Electrical Semester 1 Regular] as T1
inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
+---------------+---------------+
| department_id | department_id |
+---------------+---------------+
| 1 | 1 |
+---------------+---------------+
但是,由于 [Electrical Semester 1 Regular] 和 [Electrical Semester 2 Regular] 的列名相同,因此以下查询返回错误。在 SQL Server 中,如果我们想创建一个视图或函数,我们必须使用别名给出唯一的名称
create function fn_electricalsem1and2()
returns table
as
return (
Select *
from [Electrical Semester 1 Regular] as T1
inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)
在 SQL Server 中,如果我们要创建视图或函数,我们必须给出唯一的名称。您可以使用别名启用它,以便您可以更改查询,如下所示;
create function fn_electricalsem1and2()
returns table
as
return (
Select t1.department_id as t1_department_id , t2.department_id as t2_department_id
from [Electrical Semester 1 Regular] as T1
inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)
GO
select * from fn_electricalsem1and2()
+------------------+------------------+
| t1_department_id | t2_department_id |
+------------------+------------------+
| 1 | 1 |
+------------------+------------------+
【讨论】:
以上是关于内联函数,每个视图或函数中的列名必须唯一的主要内容,如果未能解决你的问题,请参考以下文章
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML