SQL反向JOIN查询

时间:2016-08-24 16:49:17

标签: sql sql-server

MS-SQL Server

Table A (Study_ID,Issue_Id)  
          XX,1  
          BB,2   

Table B (Study_ID,System_Id)  
         XX,User1  
         BB,User2  
         XX,User2    

View V : (Issue_Id,System_Id)  
           2,User1

View V应该为Table A提供System_Id X的所有问题,Table BStudy的组合不在SytemID

目的是,表A具有问题(Issue_Id),它们与Study(Study_id)相关联。如果用户User1登录到系统,他应该能够看到表A中的所有问题,除了具有用户没有权限的study_id的问题。表B表示用户没有权利的StudyId

如何以有效的方式实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以尝试列出Study_IDs和System_IDs的所有组合,然后通过左连接,您可以看到该组合是否存在。

我对您对用户权限的评论感到有些困惑。这更像是一个数据库问题,还是在AND System_ID = 'User1'语句中使用WHERE作为解决方案?

WITH T_A AS (SELECT *
             FROM ( VALUES ('XX', 1)
                         , ('BB', 2)
                    ) x (Study_ID, Issue_ID)
            )
    , T_B AS (SELECT * 
              FROM ( VALUES ('XX', 'User1')
                          , ('BB', 'User2')
                          , ('XX', 'User2')
                    ) x ( Study_ID, System_ID)
             )

SELECT Issue_ID, USERS.System_ID
FROM T_A 
INNER JOIN (SELECT DISTINCT System_ID FROM T_B) USERS
ON 1 = 1
LEFT JOIN T_B
ON T_A.Study_ID = T_B.Study_ID
AND USERS.System_ID = T_B.System_ID
WHERE T_B.Study_ID IS NULL

答案 1 :(得分:-2)

这是一种方法:

select * from a
 except
 select * from b