オブジェクトのリストとそれらが満たす要件を含むテーブルがあります。次に、タスクのリストと、タスクを実行するためにオブジェクトが満たす必要のある要件を含むテーブルがあります。クエリを実行します。タスクを指定すると、そのタスクを実行できるすべてのオブジェクトが表示され、オブジェクトを指定すると、そのオブジェクトが実行できるすべてのタスクが表示されます。
例:
task_reqテーブル
tasks | reqs
-----------------
taskA | req1
taskA | req2
taskA | req3
taskB | req4
taskB | req5
taskB | req6
したがって、この表は、taskAを実行するには、要件req1、req2、およびreq3が必要であることを示しています。
obj_reqsテーブル
object | reqs
----------------
obj1 | req3
obj1 | req4
obj2 | req1
obj2 | req2
obj2 | req3
obj2 | req4
だから私は質問をすることができます:どのオブジェクトがtaskAを実行できますか?答えは1行だけです。
tasks | objects
-------------------
taskA | object2
obj2は要件req1、req2、req3を満たす唯一のものだからです。別の質問:どのオブジェクトがtaskBを実行できますか?要件はreq4、req5、req6のオブジェクトがないため、答えはありません。クエリは、複数の行を返すことによって1つのタスクを複数のオブジェクトで実行できるロジックを処理する必要があります。
問題は次のとおりです。これはどのクエリですか。
私の問題は、そのようなクエリをなんとか見つけることができたことですが、複雑すぎるようです。クエリは基本的には次のとおりです。A)obj_reqsテーブルを含む内部結合task_reqsテーブル、タスクとobjでグループ化し、個別の要件をカウントします。B)タスクを選択し、タスクごとにgroup_task(distinct(reqs))からグループ化します。 taskとcount(distinct(reqs))の両方で。
このクエリを実行する簡単な方法は確かにありますよね?
SQLコードの下に貼り付けて、テーブルとクエリを生成しています。
create table task_reqs (task varchar, req varchar);
create table obj_reqs (object varchar, req varchar);
insert into task_reqs values ('taskA', 'req1');
insert into task_reqs values ('taskA', 'req2');
insert into task_reqs values ('taskA', 'req3');
insert into task_reqs values ('taskB', 'req4');
insert into task_reqs values ('taskB', 'req5');
insert into task_reqs values ('taskB', 'req6');
insert into obj_reqs values ('obj1','req1');
insert into obj_reqs values ('obj1','req3');
insert into obj_reqs values ('obj2','req1');
insert into obj_reqs values ('obj2','req2');
insert into obj_reqs values ('obj2','req3');
insert into obj_reqs values ('obj2','req4');
そして私のクエリ:
select t.task,t.object,n.n_reqs
from (
select task,object,count(distinct(obj_reqs.req)) as n_reqs
from task_reqs
inner join obj_reqs on task_reqs.req=obj_reqs.req
group by task,object
) t
inner join (
select task,count(distinct(req)) as n_reqs
from task_reqs
group by task
) n
on n.n_reqs=t.n_reqs and n.task=t.task;
これは次を返します:
task | object | n_reqs
-------+--------+--------
taskA | obj2 | 3
確かにもっと簡単な方法があります。
distinctですが、関数ではありません。distinctかっこで使用される列を囲むことは何も変更せず、役に立ちません。count(distinct (a))と同じですcount(distinct a)