1

我有两张桌子

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

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

一份报告可以有许多模板。如何查询以获取具有与项目列表匹配的模板的报告

例如,如果模板有这些行

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

选择报告时,我需要确保我的表中的所有模板都在过滤器标准中,如果过滤器标准中有其他项目不在数据库中,则无关紧要。

例子

查找 Template 的所有报告 a,b,c。这将返回报告 1,因为a,b它是 的子集a,b,c,报告 2 因为它是c的子集 a,b,c

查找模板的所有报告a - 这将没有行。因为没有只有 ONLY 作为a模板的报告

查找模板的所有报告c - 这只会返回报告 2。

查找模板的所有报告c,d - 这只会返回报告 2和3c作为.c,ddc,d

查找模板的所有报告d,e - 这只会返回报告 3,因为d它是c,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

此查询返回2,我认为从描述中是正确的:

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

编辑:这基本上是斯科特的答案,但我没有看到。对不起。

于 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 回答