2012-09-18 69 views
1

比賽我有兩個表查詢在所有

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

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

一個報表可以有許多模板。我怎樣才能查詢來獲取具有匹配的項目列表模板報告

例如,如果模板有這些行

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

當選擇報告我需要確保我的表中的所有模板都在文件管理器標準,如果篩選條件中沒有數據庫中有附加項目,則無關緊要。

例子

找到模板a,b,c所有報告。 這將返回報告1,因爲a,ba,b,c一個子集,還報告2,因爲它是一個ca,b,c

一個子集,找到模板a所有報告 - 這將沒有行。因爲沒有報告,只是有一個只a模板

找到模板c所有報告 - 這隻會返回報告2.

找到所有報告的模板c,d - 這隻會返回報告2和3因爲cc,d的子集,並且d也是c,d的子集。

找到模板d,e所有報告 - 這隻會返回報告3爲dc,e

+0

'c'也是'a,b,c'的一個子集,爲什麼你的第一個例子不會返回報告2 ? – lanzz

+0

當然報告「a,b,c」應該報告1和2?以及只有報告1,肯定會返回報告1? – BugFinder

+0

@lanzz對不起,你是正確的,我會更新我的錯誤。BugFinder辜負你的名字我看到=) – Daveo

回答

2

這裏是一個SQLFiddle demo

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) 
+0

真棒從來不知道SQLFiddle存在,你的代碼工作得很好 – Daveo

1

一個子集,找到所有的在你的一套模板的報告;從所有報告中減去一個不在你的集合中的模板。

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 

編輯:這基本上是斯科特的答案,但我還沒有看到它。抱歉。

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>) 
+0

謝謝,但未能得到這個工作零下似乎是Oracle或DB特定的命令,而不是標準 – Daveo

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 
+0

感謝您的兼具優良他們似乎答案很好地工作,我可以僅僅通過VALEX複製並粘貼到SQLFiddle,他們只是工作!希望我可以選擇更多的正確答案。與Valex一起看執行計劃,看起來他的表現會更快? – Daveo

+0

剖析會是最好的,但做不到這一點那麼這將是合理的考慮執行計劃。 – Neil