如何在视图中连接多个表

时间:2017-12-20 12:59:47

标签: sql sql-server sql-server-2012

如何创建此查询的视图任何人都可以帮助我,我想创建此视图,但它显示我错误

  

Msg 4506,Level 16,State 1,Procedure ordersview,Line 3 Column names   在每个视图或函数中必须是唯一的。栏目名称' ID'在视野中   功能' ordersview'被指定不止一次。

CREATE VIEW ordersview
AS
Select * from UserClaimData cd
 Inner join UserClaimDeductions ud on
ud.CLAIMID = cd.ID 
Inner join UserClaimApproval  ua on
ua.CLAIMID = cd.ID  
inner join ClaimDataBreakdown cb on
cb.CLAIMID = cd.ID
inner join  AppExpenseTypes ae on
ae.ID = cb.EXPENSETYPE 
inner join AppNOWTypes an on
ae.ID =  an.EXPENSETYPEID
inner join  AppAreas aa on
aa.ID = cb.AREAID 
inner join AppZones az on
cb.ZONEID = az.ID
inner join AppRegions ar on
ar.ID = cb.REGIONID

4 个答案:

答案 0 :(得分:1)

您提出的问题的答案是专门引用每个表格中的元素;例如:

CREATE VIEW ordersview
AS
Select cd.ID AS ID1, ua.ID as ID2, etc... from UserClaimData cd
 Inner join UserClaimDeductions ud on
ud.CLAIMID = cd.ID 
Inner join UserClaimApproval  ua on
ua.CLAIMID = cd.ID  
inner join ClaimDataBreakdown cb on
cb.CLAIMID = cd.ID
inner join  AppExpenseTypes ae on
ae.ID = cb.EXPENSETYPE 
inner join AppNOWTypes an on
ae.ID =  an.EXPENSETYPEID
inner join  AppAreas aa on
aa.ID = cb.AREAID 
inner join AppZones az on
cb.ZONEID = az.ID
inner join AppRegions ar on
ar.ID = cb.REGIONID
但是,我建议你不要在视图中放置这么复杂的连接。考虑所需的列,并考虑存储过程或表值函数。

答案 1 :(得分:0)

您不理解错误消息的哪一部分?

您有select *,它汇集了所有表格中的所有列。仅基于join条件,很明显大多数表都有ID列,因此有多个列名为IDCLAIMID似乎也很受欢迎。

一般情况下,不鼓励使用select *。但是,它不应该用于视图。视图应说明它包含的列:

select cd.Id, . . .

答案 2 :(得分:0)

视图就像一个虚拟表,因此您不能为2(或更多)列提供相同的名称。

因此,为了避免这种情况,在您的选择查询而不是*提供列名称,如果有2列具有相同的名称,并且您在视图中都需要它们,请为它们指定不同的别名。

假设您在TableA和TableB中有ColumnA,并且您希望它们都在视图中。创建这样的视图

CREATE VIEW vm_Sample
SELECT 
A.COLUMNA COLUMNA_1,
B.COLUMNA COLUMNA_2 
    FROM TABLEA A INNER JOIN TABLE B
    ON A.ID = B.ID

答案 3 :(得分:0)

您的视图有多个具有相同名称的列,这导致错误。

  • AppRegions有一列名为ID

  • AppAreas有一列名为ID

  • UserClaimData有一列名为ID

更改Select *以指定要在View表上使用的表的列,并添加特定名称,或者不要放置它们。

您需要更改视图中某些列的名称。使用AppAreas.ID as aaID