问题描述
我有两个表名称,分别是“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')
如果 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')