簡體   English   中英

SQL加入類似的SELECTS

[英]SQL joining similar SELECTS

我有兩個類似的SELECT語句試圖獲得重疊,其中特定用戶和另一個用戶的數據集是相同的。 我有以下但仍然收到錯誤:

Msg 8156,Level 16,State 1,Line 30為'T1'多次指定了'PermissionId'列。

Msg 8156,Level 16,State 1,Line 40為'T2'多次指定了'PermissionId'列。

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

有人可以指導我哪里出錯了?

提前致謝

由於您使用的是派生表,因此必須使用唯一的列名。 你是選擇PermissionId兩次從柱rp第一派生表和rp1第二derievd表。
從派生表中刪除顯式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 也許最好描述一下你的目標,而不是試圖去實現目標。

select語句不能顯示多個具有相同名稱的列。在select語句中使用rp.permissionId的別名

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

另外,請檢查最后一次加入條件

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

工作正常。 rp和rp1是T1和T2派生表的內部。 它們無法在外部識別。 您可以使用以下替換

ON T1.permissionId = T2.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM