每个视图或函数中的列名必须是唯一的

Posted

技术标签:

【中文标题】每个视图或函数中的列名必须是唯一的【英文标题】:Column names in each view or function must be unique 【发布时间】:2015-04-08 06:25:02 【问题描述】:

在创建视图时我收到错误,但是在构建选择查询时我只得到一个记录。我必须对两个表都使用 col1 和 col2..如果数据不存在它将从 B 表中获取一张表。我该怎么做。提前谢谢..

Create View ViewName AS
select 
A.col1 as col1,
A.col2  as col2,
null as col1,
B.col2 as col2
from table A,table B where A.col3=B.col3

【问题讨论】:

但我需要对两个表都使用 col1 和 col2..如果 A 表中不存在数据,它将从 B 表中获取.. 【参考方案1】:

从您的 cmets 看来,您正在寻找这个:

Create View ViewName AS
select 
   A.col1,
   COALESCE(A.col2, B.col2) AS col2
from table A
  left join table B 
  on  A.col3=B.col3;

使用LEFT OUTER JOIN 处理连接失败的情况。

实际错误说明:

错误说明了一切 - 您的视图有两列名为 col1 和两列 col2。更改其中一组的列名称。与视图不同,即席选择查询不需要唯一的名称(或任何列名,就此而言)。

【讨论】:

alter view temp as select COALESCE(A.col1,null,null,D.col1) as col1, COALESCE(A.col2,B.col2,C.col2,D.col2) as col2从表 A INNER JOIN table1 B INNER JOIN table3 C INNER JOIN table4 ON (A.col3=B.col3 and A.col3=C.col3 and A.col3=D.col3)【参考方案2】:

根据您的评论,您可能需要这样的东西:

CREATE VIEW ViewName AS
SELECT ISNULL(A.col1, B.col1) as col1, -- This will return B.Col1 if A.Col1 is null
       ISNULL(A.col2, B.col2) as col2,
FROM table A INNER JOIN table B ON(A.col3 = B.col3)

编辑

根据您对此答案的 cmets,您可以执行以下操作:

ALTER VIEW temp AS 

SELECT COALESCE(A.col1, D.col1) as col1,
COALESCE(A.col2, B.col2, C.col2, D.col2) as col2 
FROM table A 
INNER JOIN table1 B ON (A.col3=B.col3)
INNER JOIN table3 C ON (A.col3=C.col3)
INNER JOIN table4 D ON (A.col3=D.col3) 

注意:你写了COALESCE(A.col1,null,null,D.col1),这相当于COALESCE(A.col1, D.col1),因为coalesce函数将返回它接收到的第一个不为空的参数。

【讨论】:

如果我有超过 2 张桌子怎么办? 然后使用 COALESCE。它可能需要超过 2 个参数。 msdn.microsoft.com/en-us/library/ms190349.aspx 像这样..alter view temp as select COALESCE(A.col1,null,null,D.col1) as col1, COALESCE(A.col2,B.col2,C.col2,D. col2) as col2 from table A INNER JOIN table1 B INNER JOIN table3 C INNER JOIN table4 ON (A.col3=B.col3 and A.col3=C.col3 and A.col3=D.col3) 但它给出了所有记录组合。JOIN 不起作用 你能提供一些示例数据和所需的输出吗?【参考方案3】:

这样我们可以做到吗?

alter view temp as select COALESCE(A.col1,null,null,D.col1) as col1, COALESCE(A.col2,B.col2,C.col2,D.col2) as col2 from table A INNER JOIN table1 B INNER JOIN table3 C INNER JOIN table4 ON (A.col3=B.col3 and A.col3=C.col3 and A.col3=D.col3) 

【讨论】:

以上是关于每个视图或函数中的列名必须是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图中连接多个表

每个表中的列名必须是唯一的。表“dbo.Foos”中的列名“StripeRecipientId”被指定多次

“数据库更新期间,每个表中的列名必须是唯一的。”

创建触发器的问题。每个表中的列名必须是唯一的。微软SQL

使用视图在 couchDB 中的文档之间返回唯一值

使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键