基于Another Query的值的不同查询的相交或公共值

时间:2013-07-17 13:15:18

标签: sql sql-server-2008 intersection

我有一个像这样的父表

    ID    |   ParentTestID    |   TestID
----------------------------------------
    1     |        10         |    15
    2     |        10         |    25
    3     |        10         |    35

第二张表

ID    |   TestID    |   TestName    |   LanguageID
-----------------------------------------
1     |   15         |    Test1      |      8  
2     |   15         |    Test2      |      3  
3     |   15         |    Test3      |      1  
4     |   25         |    Test1      |      5  
5     |   25         |    Test2      |      3  
6     |   25         |    Test3      |      4  
7     |   35         |    Test1      |      3  
8     |   35         |    Test2      |      8  
9     |   35         |    Test3      |      9  

当我只在第一个表上知道ParentTestID时,我的方案是从第二个表中找到公共语言ID

这意味着如果我知道父TestID 10,结果将为3 ,因为10岁以下的所有testID都具有公共语言ID 3

父ID下的testID数量也是不可预测的。它不会只是3。

我正在寻找没有光标或类似复杂情况的查询。

2 个答案:

答案 0 :(得分:3)

SELECT b.LanguageID
FROM    firstTable a
        INNER JOIN secondTable b    
            ON a.TestID = b.TestID
WHERE   a.ParentTestID = 10
GROUP   BY b.languageID
HAVING  COUNT(DISTINCT b.TestID) =
        (
          SELECT COUNT(c.testid) 
          FROM   firsttable c 
          WHERE  c.parenttestid = 10
        )

HAVING COUNT(DISTINCT b.TestID)行中,如果DISTINCT对于每个LanguageID都是唯一的,则不需要使用TestID关键字。

答案 1 :(得分:0)

假设每个tests只有3 parenttestid,您可以尝试以下查询:

select distinct languageid
from child
where testid in (select testid from parent where parenttestid = 10)
group by languageid having count(*) > 2

编辑:

如果计数未修复,则此查询将起作用:

select distinct languageid
from child
where testid in (select testid from parent where parenttestid = 10)
group by languageid
having count(testid) = (select count(testid) from parent where parenttestid = 10)