2013-08-22 2 views
2

У меня есть две таблицы, которые перечислены ниже.SQL Server: Результат, который соответствует всем значениям в списке

TableA

StudentID StudentName 
1   A 
2   B 
3   C 
4   D 
5   E 

TableB

StudentID ClassID SectionID 
1   2  5 
3   2  7 

Теперь я пытаюсь получить тех студентов, для которых все элементы в списке ввода матчей.

Например, если я передаю список ввода (ClassID & SectionID) в (2, 5), он должен вернуть StudentID: 1
Если я передаю список ввода как (2, 5 | 1, 1) он не должен возвращать StudentID: 1

DECLARE @tblData AS TABLE 
(
    [ClassID]  INT 
    ,[SectionID] INT 

) 

INSERT INTO @tblData VALUES (2, 5) 
INSERT INTO @tblData VALUES (2, 1) 

SELECT 
    A.[StudentID] 
    ,A.[StudentName] 
    ,B.[ClassID] 
    ,B.[SectionID] 
FROM 
    [AAAAAA] AS A 
     INNER JOIN [BBBBBB] AS B 
      ON A.[StudentID] = B.[StudentID] 
     INNER JOIN @tblData AS C 
      On B.[ClassID] = C.[ClassID] AND B.[SectionID] = C.[SectionID] 

к сожалению, указанный выше запрос не возвращает ожидаемое значение.

Не могли бы вы помочь мне?

ответ

1

Мы должны JOIN стол B с @tblData и группой StudentId. Затем с помощью HAVING выберите все StudentID из этого соединения, где count строк = количество строк в @tblData. Это означает, что этот studentId соответствует всем элементам в списке ввода

SELECT 
    A.[StudentID] 
    ,A.[StudentName] 
    ,B.[ClassID] 
    ,B.[SectionID] 
FROM A 
    INNER JOIN B 
      ON A.[StudentID] = B.[StudentID] 
    INNER JOIN 
     (
      SELECT StudentID FROM @tblData 
          JOIN B ON @tblData.ClassID=B.ClassID 
             AND 
             @tblData.SectionID=B.SectionID 
      GROUP BY StudentID 
      HAVING COUNT(*) = (SELECT COUNT(*) FROM @tblData) 
) AS T1 on A.StudentID=T1.StudentID 

SQLFiddle demo

+0

Привет, Valex, Спасибо за вашу большую помощь. Но я изменил записи в SQLFiddle. http://sqlfiddle.com/#!6/33551/1. Теперь он должен вернуть StudentID 1 и 3. Не могли бы вы посмотреть на это? –

+0

Привет Valex, если я изменю эту строку HAVING COUNT (*) = (SELECT COUNT (*) FROM @tblData), как HAVING COUNT (*)> 0, тогда он работает нормально. Я прав? Пожалуйста помоги. –

0

Дело в том, что, поскольку вы присоединяетесь к @tblData с B, двигатель соответствует всей таблице B с @tblData. Таким образом, если вы передадите список входных значений, вы получите каждого ученика, который соответствует одной записи в @tblData.

Чтобы избежать этого, вы можете вставить какое-либо предложение where/groupby, которое соответствует количеству записей для одного ученика с подсчетом записей в @tblData или подзапросе.

+0

Привет Бенедикт, Спасибо за ваш ответ. Можете ли вы привести мне пример этого? –

+0

см. Valex 'ответ –

Смежные вопросы