多个外部联接

时间:2019-05-08 04:28:05

标签: sql sql-server

我有几个表链接在一起,以定义对特定安全配置文件的字段访问。我正在尝试获取2个不同的安全配置文件之间的差异的列表。这是表格的细分...

  

表名:FIELD字段:FIELDID,FIELDNAME

     

表名:FIELDPERMISSION字段:FIELDPERMISSIONID,PERMISSONTYPE,   FIELDID

     

表名:PROFILEPERMISSION字段:SECURITYPROFILEID,   FIELDPERMISSIONID

表FIELD列出了所有可以控制的字段。

由于创建了FIELD和PERMISSIONTYPE的不同组合,因此在表FIELDPERMISSION上添加了行。例如,FIELD设置可能与“地址”相关,而PERMISSIONTYPE可能是“读取”。如果创建了另一个安全配置文件,允许该地址“写” PERMISSIONTYPE,则将在FIELDPERMISSION表中创建一条新记录。但是,如果新的安全配置文件还希望对地址字段具有只读访问权限,则不需要FIELDFIMISSION中的新记录。

最后,PROFILEPERMISSION将字段/权限映射到每个特定的配置文件。请注意,如果概要文件没有对FIELD的任何类型的访问,则PROFILEPERMISSION表中没有该记录的记录。

因此,我试图获取2个给定的安全配置文件之间的差异列表。理想情况下,所有字段及其权限都应包含在任一配置文件中,并带有一些文本,以表明该特定字段/权限组合只是特定配置文件还是两者都包含。

以下是一些示例数据

FIELD
+---------+---------------+
| FIELDID |   FIELDNAME   |
+---------+---------------+
|       1 | Address       |
|       2 | Telephone     |
|       3 | Date of Birth |
+---------+---------------+

FIELDPERMISSION
+-------------------+---------------+---------+
| FIELDPERMISSIONID | PERMISSONTYPE | FIELDID |
+-------------------+---------------+---------+
|                 1 | Read          |       1 |
|                 2 | Write         |       1 |
|                 3 | Write         |       2 |
|                 4 | Read          |       3 |
+-------------------+---------------+---------+

PROFILEPERMISSION
+-------------------+-------------------+
| SECURITYPROFILEID | FIELDPERMISSIONID |
+-------------------+-------------------+
| x                 |                 1 |
| y                 |                 2 |
| y                 |                 3 |
| x                 |                 4 |
| y                 |                 4 |
+-------------------+-------------------+

这将返回

+---------------+-------+--------+
| Address       | Read  | X Only |
| Address       | Write | Y Only |
| Telephone     | Write | Y Only |
| Date of Birth | Read  | Both   |
+---------------+-------+--------+

这是我到目前为止的代码尝试,但是我没有得到任何返回的记录...

SELECT f.FIELDNAME, 
case when fp1.FIELDPERMISSIONID is null then fp2.PERMISSONTYPE else fp1.PERMISSONTYPE end,
case when fp2.FIELDPERMISSIONID is null then fp1.PERMISSONTYPE else fp2.PERMISSONTYPE end,
case when fp1.FIELDPERMISSIONID is null then 'Y Only' else 'Both' end,
case when fp2.FIELDPERMISSIONID is null then 'X Only' else 'Both' end
from FIELD f
left join FIELDPERMISSION fp1 on f.FIELDID = fp1.FIELDID
left join FIELDPERMISSION fp2 on f.FIELDID = fp2.FIELDID
left join PROFILEPERMISSION pp1 on fp1.FIELDPERMISSIONID = pp1.FIELDPERMISSIONID
left join PROFILEPERMISSION pp2 on fp2.FIELDPERMISSIONID = pp2.FIELDPERMISSIONID
where pp1.securityprofileid = 'x' and pp1.securityprofileid = 'y'
and (fp1.FIELDPERMISSIONID is null or fp2.FIELDPERMISSIONID is null)

0 个答案:

没有答案