2

以下にリストされている2つのテーブルがあります。

表A

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

表B

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]

残念ながら、上記のクエリは期待値を返しません。

手伝ってくれませんか?

4

2 に答える 2

1

JOINでテーブル化B@tblData、 でグループ化する必要がありますStudentId。次に、HAVINGselect all StudentIDfrom this connection を使用します。ここで、行数 = 内の行数です@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 デモ

于 2013-08-22T07:05:16.343 に答える
0

ポイントは、@tblData を B と結合しているため、エンジンはテーブル B 全体を @tblData と一致させることです。このように、入力値のリストを渡すと、@tblData の 1 つのエントリに一致するすべての生徒が取得されます。

これを回避するには、1 人の学生のエントリ数を @tblData のエントリ数と一致させる where/groupby 句を挿入するか、サブクエリを挿入します。

于 2013-08-22T07:01:13.563 に答える