如何在视图中连接多个表

问题描述 投票:0回答:4

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

消息4506,级别16,状态1,过程订单视图,第3行每个视图或函数中的列名必须是唯一的。视图或函数“ordersview”中的列名“ID”被指定多次。

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
sql sql-server sql-server-2012
4个回答
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

但是,我建议你不要在视图中放置这么复杂的连接。考虑所需的列,并考虑存储过程或表值函数。


0
投票

你不明白错误信息的哪一部分?

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

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

select cd.Id, . . .

0
投票

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

  • AppRegions有一个名为ID的专栏
  • AppAreas有一个名为ID的专栏
  • UserClaimData有一个名为ID的专栏

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

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


0
投票

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

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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.