2017-04-12 73 views
1

我有两个类似的SELECT语句试图获得重叠,其中一个特定用户的数据集和另一个是相同的。我有以下的,但不断收到错误:SQL加入类似SELECTS

Msg 8156, Level 16, State 1, Line 30 The column 'PermissionId' was specified multiple times for 'T1'.

Msg 8156, Level 16, State 1, Line 40 The column 'PermissionId' was specified multiple times for 'T2'.

SELECT TOP 100 T1.Name, T1.permissionId 
FROM (SELECT top 100 n.Name, rp.permissionId, rp.* 
FROM dbo.[User] AS u 
    JOIN dbo.UserRole AS ur ON ur.UserId = u.UserId 
    JOIN dbo.ClientRole as cr on cr.RoleId = ur.RoleId 
    JOIN dbo.Name as n2 on cr.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp on rp.RoleId = ur.RoleId 
    JOIN dbo.SystemTaxonomy AS st on st.SystemTaxonomyId = rp.PermissionId 
    JOIN dbo.Name AS n on st.NameId = n.NameId 

WHERE u.LoginName IN ('user1')) AS T1 
JOIN (SELECT top 100 n1.Name, rp1.permissionId, rp1.* 
FROM dbo.[User] AS u1 
    JOIN dbo.UserRole AS ur1 ON ur1.UserId = u1.UserId 
    JOIN dbo.ClientRole as cr1 on cr1.RoleId = ur1.RoleId 
    JOIN dbo.Name as n2 on cr1.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp1 on rp1.RoleId = ur1.RoleId 
    JOIN dbo.SystemTaxonomy AS st1 on st1.SystemTaxonomyId = rp1.PermissionId 
    JOIN dbo.Name AS n1 on st1.NameId = n1.NameId 
WHERE u1.LoginName IN ('user2')) AS T2 
ON T1.rp.permissionId = T2.rp1.permissionId 

是否有人可以指导我,什么是错的?

在此先感谢

+0

看rp.permissionId,RP *和尝试rp.permissionId AS Perm_ID,RP 。*或删除rp.permissionId – etsa

回答

2

由于使用派生表,则必须使用唯一的列名。 您在第一个派生表中从rp中选择PermissionId列,并在第二个表中从rp1中选择两列。
取出明确rp.permissionId,并从您的派生表rp1.permissionId,,你不应该再看到这些错误:

SELECT TOP 100 T1.Name, T1.permissionId 
FROM (SELECT top 100 n.Name, rp.* 
FROM dbo.[User] AS u 
    JOIN dbo.UserRole AS ur ON ur.UserId = u.UserId 
    JOIN dbo.ClientRole as cr on cr.RoleId = ur.RoleId 
    JOIN dbo.Name as n2 on cr.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp on rp.RoleId = ur.RoleId 
    JOIN dbo.SystemTaxonomy AS st on st.SystemTaxonomyId = rp.PermissionId 
    JOIN dbo.Name AS n on st.NameId = n.NameId 

WHERE u.LoginName IN ('user1')) AS T1 
JOIN (SELECT top 100 n1.Name, rp1.* 
FROM dbo.[User] AS u1 
    JOIN dbo.UserRole AS ur1 ON ur1.UserId = u1.UserId 
    JOIN dbo.ClientRole as cr1 on cr1.RoleId = ur1.RoleId 
    JOIN dbo.Name as n2 on cr1.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp1 on rp1.RoleId = ur1.RoleId 
    JOIN dbo.SystemTaxonomy AS st1 on st1.SystemTaxonomyId = rp1.PermissionId 
    JOIN dbo.Name AS n1 on st1.NameId = n1.NameId 
WHERE u1.LoginName IN ('user2')) AS T2 
ON T1.permissionId = T2.permissionId 

不过,我怀疑这是一个XYProblem。也许最好描述一下你的目标,而不是试图去那里。

+0

必须更改最后一行:ON T1.rp.permissionId = T2.rp1.permissionId –

+0

谢谢,我编辑了我的答案。 –

1

在SELECT语句中的select语句无法显示与同name.Use别名rp.permissionId多列

SELECT top 100 n.Name, rp.permissionId As 'Permission_Id', rp.* 

另外,请检查最后一个加入条件

ON T1.rp.permissionId = T2.rp1.permissionId 

工作精细。 rp & rp1在T1派生表中位于T1 &内部。它们不能被外部识别。 你可以用下面的代替

ON T1.permissionId = T2.permissionId

+0

答案的第一部分无效 –

+0

第二部分有用吗? – Kapil

+0

是的,这就是为什么我upvoted –

0

我用替换:

SELECT TOP 100 T1.Name, T1.permissionId 
FROM (SELECT top 100 n.Name, rp.* 
FROM dbo.[User] AS u 
    JOIN dbo.UserRole AS ur ON ur.UserId = u.UserId 
    JOIN dbo.ClientRole as cr on cr.RoleId = ur.RoleId 
    JOIN dbo.Name as n2 on cr.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp on rp.RoleId = ur.RoleId 
    JOIN dbo.SystemTaxonomy AS st on st.SystemTaxonomyId = rp.PermissionId 
    JOIN dbo.Name AS n on st.NameId = n.NameId 

WHERE u.LoginName IN ('user1')) AS T1 
JOIN (SELECT top 100 n1.Name, rp1.* 
FROM dbo.[User] AS u1 
    JOIN dbo.UserRole AS ur1 ON ur1.UserId = u1.UserId 
    JOIN dbo.ClientRole as cr1 on cr1.RoleId = ur1.RoleId 
    JOIN dbo.Name as n2 on cr1.NameId = n2.NameId 
    JOIN dbo.RolePermissions AS rp1 on rp1.RoleId = ur1.RoleId 
    JOIN dbo.SystemTaxonomy AS st1 on st1.SystemTaxonomyId = rp1.PermissionId 
    JOIN dbo.Name AS n1 on st1.NameId = n1.NameId 
WHERE u1.LoginName IN ('user2')) AS T2 
ON T1.permissionId = T2.permissionId