如果我不创建视图,那么这个语句可以正常工作。但是当我试图创建一个视图时,它给了我一个错误:
msg 4506,level 16,state 1,procedure uv\u azrcrv\u sopoplink,每个视图或函数中的第3行列名必须唯一。视图或函数“uv\u azrcrv\u sopoplink”中的列名“popRequestionNumber”指定了多次。
CREATE VIEW uv_AZRCRV_SOPPOPLink AS SELECT
['Purchase Order Requisition'].*
,['Purchase Order Requisition Line'].*
,['Purchase Order'].*
,['Purchase Order Line'].* FROM
(SELECT
POPRequisitionNumber
,DOCDATE
FROM
POP10200
UNION ALL
SELECT
POPRequisitionNumber
,DOCDATE
FROM
POP30200) AS ['Purchase Order Requisition Line']
INNER JOIN
(SELECT
POPRequisitionNumber
,ORD
,ITEMNMBR
,QTYORDER
FROM
POP10210
UNION ALL
SELECT
POPRequisitionNumber
,ORD
,ITEMNMBR
,QTYORDER
FROM
POP30210) AS ['Purchase Order Requisition']
ON ['Purchase Order Requisition'].POPRequisitionNumber = ['Purchase Order Requisition Line'].POPRequisitionNumber
LEFT JOIN
SOP60100 AS ['SOP_POPLink']
ON
['SOP_POPLink'].SOPNUMBE = ['Purchase Order Requisition'].POPRequisitionNumber
AND
['SOP_POPLink'].LNITMSEQ = ['Purchase Order Requisition'].ORD
LEFT JOIN
(SELECT
PONUMBER
,ORD
FROM
POP10110
UNION ALL
SELECT
PONUMBER
,ORD
FROM
POP30110) AS ['Purchase Order Line']
ON
['Purchase Order Line'].PONUMBER = ['SOP_POPLink'].PONUMBER
AND
['Purchase Order Line'].ORD = ['SOP_POPLink'].ORD
LEFT JOIN
(SELECT
PONUMBER
,DOCDATE
FROM
POP10100
UNION ALL
SELECT
PONUMBER
,DOCDATE
FROM
POP30100) AS ['Purchase Order']
ON
['Purchase Order'].PONUMBER = ['Purchase Order Line'].PONUMBER
GO
2条答案
按热度按时间wqsoz72f1#
视图定义的输出中有多个同名的列。例如
POPRequisitionNumber
两者都有['Purchase Order Requisition']
以及['Purchase Order Requisition Line']
因为您在select语句中从这两个表中选择了select*(所有列)。您必须单独指定所需的确切列,或者对它们进行别名以使它们唯一。
单独运行select语句时,这是正常的,因为结果中的列名不会存储在任何位置,但如果尝试创建视图,则不能有两个同名的列。
如果将此查询用作子查询,则会面临相同的问题。
z0qdvdin2#
SELECT *
快速简单,但有时有害。这是有害的情况之一。特别是引用戴夫·马克尔对这个问题的回答:
绑定问题。选择时,可以从两个不同的表中检索同名的两列。这通常会使数据使用者崩溃。假设一个查询连接两个表,两个表都包含一个名为“id”的列。消费者怎么知道哪个是哪个?当底层表结构发生变化时,select也会混淆视图(至少在某些版本的sql server中是这样)——视图没有重建,返回的数据可能是无意义的。最糟糕的是,你可以小心地给你的专栏取你想要的名字,但是下一个来的人可能不知道,他不得不担心添加一个专栏会与你已经开发的名字相冲突。
在您的示例中,要从中选择的两个或多个表都有一个名为
POPRequisitionNumber
. 如果数据是冗余的,只需选择一次。如果数据不是冗余的,可以使用别名为这些列中的每一列指定一个更具描述性和唯一性的名称。