【问题标题】:SQL joining similar SELECTSSQL 加入类似的 SELECTS
【发布时间】:2017-09-07 21:06:05
【问题描述】:

我有两个类似的 SELECT 语句试图在特定用户和另一个用户的数据集相同的情况下获得重叠。我有以下但不断收到错误:

消息 8156,第 16 级,状态 1,第 30 行 为“T1”多次指定了“PermissionId”列。

消息 8156,第 16 级,状态 1,第 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

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

提前致谢

【问题讨论】:

  • 查看 rp.permissionId, rp.* 并尝试 rp.permissionId AS Perm_ID, rp.* 或删除 rp.permissionId

标签: sql sql-server select join


【解决方案1】:

由于您使用的是派生表,因此您必须使用唯一的列名。 您从第一个派生表中的 rp 和第二个派生表中的 rp1 中选择了两次 PermissionId 列。
从派生表中删除显式的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。也许描述你的目标而不是你实现目标的尝试会更好。

【讨论】:

  • 不得不更改最后一行:ON T1.rp.permissionId = T2.rp1.permissionId
【解决方案2】:

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 派生表的内部。它们无法被外部识别。 你可以用下面代替

开启 T1.permissionId = T2.permissionId

【讨论】:

  • 第二部分有用吗?
【解决方案3】:

我用过:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2015-03-30
    • 2014-04-27
    相关资源
    最近更新 更多