SQL查询根据其他列在列的重复值之间选择行

问题描述

我有两个表名称,分别是“ApplicationRoles”和“FormSchema”。

我必须根据传递的租户列来选择结果,例如 -“A”或“全部” -'B' 或 '全部' -'C' 或 '全部' 等等。

现在我必须根据以下条件通过加入两个表来获得结果。并且在查询中租户“全部”是认值,并且在其他租户之间很常见。

条件: 让我们假设在查询中,如果我将租户作为“A”传递,那么结果所有行都属于租户“A”以及租户“全部”,但不属于租户“全部”一行,该行已经存在于租户“A”中。

请参阅表格和记录的小提琴。 例如dbfiddle 我将租户提供为“A”。那么下面的行不应该出现,因为 SchemaName Car 已经通过租户“A”出现了。

55b7f5e3-b8bd-4857-8db6-11d0eae92194 汽车 40ecca83-7fd9-4d63-9f56-c7a48442d844 #Test-1 全部

尝试查询

    select * from (select fs1.schemaid,fs1.schemaName,ar1.roleId,ar1.roleName,ar1.tenant from
    
    (select ar.SchemaId,ar.Tenant,ar.RoleId,ar.RoleName,ar.Capability 
    from ApplicationRoles ar) ar1
    full outer join
    (select fs.SchemaId,fs.SchemaName,fs.Tenant,fs.Capability from FormSchema fs) fs1
    
    on ar1.SchemaId= fs1.SchemaId) as t3
where (t3.Tenant='All' or t3.tenant='A')

预期/要求的结果:

output

如果 SchemaName 已经存在,如何获得结果然后不要选择“所有”租户行。

解决方法

使用 row_number()order by 来标识所需的行

select * 
from (
         select fs1.schemaid,fs1.schemaName,ar1.roleId,ar1.roleName,ar1.tenant,rn = row_number() over (partition by fs1.schemaName
                           order by case when ar1.tenant = 'ALL' then 2 else 1 end,ar1.tenant)
         from   ApplicationRoles ar1
         full outer join FormSchema fs1
                      on ar1.SchemaId= fs1.SchemaId
     ) as t3
where rn = 1
and  Tenant in ('A','All')