2016-08-24 106 views
-3

MS-SQL服务器SQL逆联接查询

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 

视图V应该给所有的问题从Table A,为SYSTEM_ID X,这是不是在Table BStudy组合和SytemID

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

如何以有效的方式实现此目的?

+4

嗨瓦伦,你需要显示你到目前为止尝试解决问题。 –

+2

JOIN只是一组在两个表中都具有匹配值的行。如果这是维恩图,那么你需要一个查询来显示所有与任何一个表都不匹配的值。但是,捕获通过System_ID号码匹配此结果集。我们将这称为外部连接。它是否正确? –

+2

你将不得不更好地解释你的问题。你想达到什么目的?是否应该在Issue_ID和System_ID之间有一些连接?我很不清楚为什么2,User1是你想要的输出,如果这真的是你想要的输出 – kbball

回答

-2

这是做这件事:

select * from a 
except 
select * from b 
+0

这只适用于列是相同的,他们不是。并且它不会得到他在V视图中定义的期望结果 – Matt

0

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

我对你对用户权利的评论有点困惑。这是更多的数据库问题,还是在WHERE声明中使用AND System_ID = 'User1'解决方案?

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