Как выбрать только записи в таблице, которые имеют все значения из другой таблицы? - PullRequest
1 голос
/ 12 мая 2011

Это сложный вопрос, но довольно просто, если объяснить немного подробнее.

У меня есть две таблицы: Standard_Test {StandardID int, TestID int} и Test {TestID int}

Стандартный_Тест: http://i51.tinypic.com/2u60ket.png

Тест: http://i51.tinypic.com/2bbqxj.png

Мне нужно выбрать список StandardID, с которыми связаны все TestID из таблицы Test. В приведенном выше примере этот запрос будет выбирать только StandardID 5 и 6, потому что у них обоих связаны идентификаторы TestID 1,2,3 (все TestID из Test).

Звучит просто, но я не смог найти правильный запрос. Спасибо заранее!

Ответы [ 4 ]

2 голосов
/ 12 мая 2011

Вы можете попробовать это, оно должно работать:

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 голос
/ 12 мая 2011

Это реляционное деление.Google для этого термина, и вы должны найти всю необходимую информацию.

1 голос
/ 12 мая 2011

Это должно работать для любого количества строк в тесте. (Предполагается, что данный 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)
0 голосов
/ 14 мая 2011

Код ниже будет работать, чтобы найти ваше требование. Проверьте это. Здесь Tab1 = Standard_Test и Tab2 = Test

Объявление @Test Int

Объявление таблицы @Tab ( Стенд Int )

Объявление курсора @Cur Установите @Cur = CURSOR For Выберите standardID из tab1 Группировать по стандарту 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...