1

私は2つのテーブルを持っています

Report
----------
report_id
name

Template
------------
template_id
report_id

レポートには多数のテンプレートを含めることができます。アイテムのリストに一致するテンプレートを含むレポートを取得するためにクエリを実行するにはどうすればよいですか

たとえば、テンプレートにこれらの行がある場合

Template_ID  | Report_ID
---------------------------
a              1
b              1
c              2
d              3 

レポートを選択するとき、テーブル内のすべてのテンプレートがファイラー基準に含まれていることを確認する必要があります。データベースにないフィルター基準に追加の項目があるかどうかは問題ではありません。

Template のすべてのレポートを検索します a,b,ca,bは のサブセットであるため、レポート 1 が返されます。 また、 のサブセット であるためa,b,c、レポート 2 も返されます。ca,b,c

テンプレートのすべてのレポートを検索a - 行がありません。aテンプレートとしてのみを持つレポートがないため

テンプレートのすべてのレポートを検索c - レポート 2 のみが返されます。

テンプレートのすべてのレポートを検索- これは、 のサブセットであり、 のサブセットでもあるため、c,d レポート 2 と 3 のみを返します。cc,ddc,d

テンプレートのすべてのレポートを検索- これはd,e レポート 3 のみを返します。dc,e

4

5 に答える 5

2

ここにSQLFiddleのデモがあります

select distinct Report_id 
   from Template T
   where Template_id in ('d','e')
   and NOT EXISTS 
      (select T1.Report_id 
        from Template T1
        where Template_id not in ('d','e')
        and T.Report_id=T1.Report_id)
于 2012-09-18T12:00:01.443 に答える
1

セット内のテンプレートを使用してすべてのレポートを検索します。セットにないテンプレートを使用して、そのすべてのレポートを差し引きます。

于 2012-09-18T11:51:15.540 に答える
1

This query returns 2, which I think is correct from the description:

SELECT DISTINCT t1.report_id
  FROM template t1
  LEFT JOIN (
    SELECT *
      FROM template
      WHERE template_id NOT IN ('b', 'c')
  ) t2 ON t1.report_id = t2.report_id
  WHERE t1.template_id IN ('b', 'c')
    AND t2.template_id IS NULL

Edit: This is basically Scott's answer, but I hadn't seen it. Sorry.

于 2012-09-18T11:55:12.700 に答える
1

ここに別のアプローチがあります。テンプレートのリストを複製する必要がないため、これが気に入っています。

SELECT t1.report_id
  FROM (
    SELECT report_id, COUNT(*) AS report_count
      FROM template
      GROUP BY report_id
  ) t1
  INNER JOIN (
    SELECT report_id, COUNT(*) AS report_count
      FROM template
      WHERE template_id IN ('b', 'c')
      GROUP BY report_id
  ) t2 ON t1.report_id = t2.report_id
  WHERE t1.report_count = t2.report_count
于 2012-09-18T12:01:16.040 に答える
0
select distinct report_id from template where template_id in (<list>)
minus
select distinct report_id from template where template_id not in (<list>)
于 2012-09-18T11:56:01.467 に答える