2017-04-12 71 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