如何仅在表中选择具有另一个表中所有值的记录?

时间:2011-05-12 16:58:21

标签: sql database tsql sql-server-2008

这是一个难以理解的问题,但在解释一下时非常简单。

我有两个表:Standard_Test {StandardID int,TestID int}和Test {TestID int}

Standard_Test:http://i51.tinypic.com/2u60ket.png

测试:http://i51.tinypic.com/2bbqxj.png

我需要选择一个StandardID列表,其中包含与Test关联的TestID中的所有TestID。在上面的示例中,此查询仅选择StandardID 5& 6因为它们都有TestID的1,2,3(所有TestID来自Test)。

听起来很简单,但我无法提出正确的查询。先谢谢!

4 个答案:

答案 0 :(得分:2)

你可以试试这个,它应该有效:

SELECT DISTINCT st.StandardId
FROM Standard_Test st JOIN Test t
ON st.TestId = t.TestId    
GROUP BY st.StandardId
HAVING COUNT(st.TestId) = (SELECT COUNT(TestId) FROM Test)

答案 1 :(得分:1)

这适用于Test中的任意数量的行。 (它假设一个给定的TestId只在Test中出现一次 - 它是主键,对吗?)

SELECT st.StandardID
 from Standard_Test st
  inner join Test te
   on te.TestID = st.TestID
 group by st.StandardID
 having count(te.TestId) = (select count(*) from Test)

答案 2 :(得分:1)

这是关系师。谷歌的那个词你应该找到你需要的所有信息。

答案 3 :(得分:0)

以下代码将起作用以查找您的要求。 看看这个。 这里Tab1 = Standard_Test和tab2 = Test

宣布@Test Int

声明@Tab表 (     站在int )

声明@Cur Cursor 设置@Cur = CURSOR For 从tab1中选择standardID 按标准ID分组

打开@Cur  获取下一个  从@Cur到@Test

WHILE @@FETCH_STATUS = 0
    Begin
        If Exists (Select 1
        From tab2
        Where estID not in (Select testId From tab1 Where StandardID = @Test))
            Begin
                insert into @Tab
                values(@Test)
            End
        Fetch Next
        From @Cur into @Test
    End

关闭@Cur DEALLOCATE @Cur

选择*来自@Tab