2016-11-27 3 views
1

対応するサブセットがテーブルBに存在するテーブルAからすべてのサブセットを選択する方法はありますか?テーブルAの各サブセットは、少なくともテーブルBの対応するサブセットのすべてのエントリを持っていなければなりません。レコードのサブセットで検索するSQL

では、これは「剰余を持つ除算」と呼ばれますが、多少の関係があるため問題はより複雑です。

ユーザ名テキスト|ファイルテキスト| ACCESSLEVEL int型

表B

AppNameはテキスト|ファイルテキスト| ACCESSLEVEL INT

サンプルデータ

User1 | aaa.txt | 1 
User1 | bbb.txt | 3 
User1 | ccc.txt | 1 
User2 | aaa.txt | 3 

表B

Appl1 | aaa.txt | 1 
Appl1 | bbb.txt | 1 
Appl2 | aaa.txt | 1 
Appl3 | bbb.txt | 5 
Appl4 | aaa.txt | 1 
Appl4 | bbb.txt | 1 
Appl4 | ccc.txt | 1 
Appl4 | ddd.txt | 1 

期待される結果:

User1 | Appl1 
User1 | Appl2 
User2 | Appl2 

ユーザー1は、これらのアプリケーションで使用されるすべてのファイルに必要なアクセス権を持っているため、アプリケーションAppl1およびAppl2に「完全な」アクセス権を持っています。アクセスレベルが十分高くないため、彼はアプリケーションAppl3にアクセスできません。彼はファイルddd.txtにアクセスできないため、アプリケーションAppl4にアクセスできません。

基本的には、レコードのサブセットを比較し、テーブルBのサブセットがテーブルAのサブセットと等しいかそれよりも大きいすべてのケースを返す必要があります。SQLで行う方法はありますか?

助けてください。

+0

あなたはストアドプロシージャを使用して考えたことはありますか?私はDB2にアクセスすることはできませんが、私の推奨は、ユーザーとアプリケーションのためのカーソル付きストアド・プロシージャーを使用することです。 – zedfoxus

+0

ヒントをありがとう。私は、私はそれを行うためにいくつかのREXXスクリプトを書くことができます。しかし、私はそれがSQLで行うことができると感じていたが、私はそれを行うために必要なスキルを持っていない。 –

答えて

0

1つの方法は、自己結合であり、一致するレコードの数をアプリケーションに必要な数と比較します。

何の重複がないと仮定すると:

select a.username, b.appname 
from a join 
    (select b.*, count(*) over (partition by b.appname) as cnt 
     from b 
    ) b 
    on a.filetext = b.filetext and 
     a.accesslevel >= b.accesslevel 
group by a.username, b.appname, b.cnt 
having count(*) = b.cnt 
+0

ありがとうございます。私はDB2のドキュメントをチェックし、それがOVER PARTITION BYをサポートしていないように見えます。しかし、私はこの選択の背後にある考え方を持っているので、それ以上の分割を使用せずにそれを模倣しようとします。 –

+0

@KrisKelvin。 。 。 DB2 *は間違いなくウィンドウ関数をサポートしており、何年も持っています。 IBMはこの機能をOLAP機能と呼び、次の文書で説明されています。http://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/sqlref/src/tpc/db2z_olapspecification.html –

+0

申し訳ありません、あなたが正しいです、私はそれを逃した必要があります。再度、感謝します。 –

0
SELECT distinct A1.USERNAME, B1.APPLICATION 
FROM TABLEUSER A1 
INNER JOIN TABLEAPPLI B1 on B1.filename=A1.filename and B1.accesslevel<=A1.accesslevel 
where not exists 
(
select * 
from TABLEUSER A2 INNER JOIN TABLEAPPLI B2 on B2.filename<>A2.filename or B2.accesslevel>A2.accesslevel 
where (A1.USERNAME, B1.APPLICATIONAME) = (A2.USERNAME, B2.APPLICATIONAME) 
) 
関連する問題