2016-08-24 65 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