2016-08-24 4 views
-3

MS-SQL Serverの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 Studyの組み合わせと目的があるSytemID

ためTable BではありませんSYSTEM_ID X、のために、Table Aからすべての問題を与えるべきで登録しようテーブルAには課題(Issue_Id)があり、Study(Study_id)に関連付けられています。ユーザーUser1がシステムにログインすると、ユーザーが権利を持っていないstudy_idを持つものとは別に、表Aのすべての問題を見ることができるはずです。表Bは、ユーザーが権利を持っていないStudyIdを示しています。

どのように効率的にこれを達成できますか?

+4

こんにちは、問題を解決するためにこれまでに何を試してみる必要があります。 –

+2

JOINは、単に両方のテーブルで一致する値を持つ行のセットです。これがベンダイアグラムの場合は、どちらのテーブルにも一致しないすべての値を表示するクエリが必要です。しかし、catchはこの結果セットをSystem_ID番号と照合しています。これをOUTER結合と呼びます。これは正しいです? –

+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