1

私のテーブル内の次のレコードは次のとおりです。

入学する学生

EnrollID     StudentID  SubjID
1            1          1
2            1          2
3            1          3
4            2          1
5            3          2

学生

StudentID     UserID     YearID     FirstName     LastName
1             1          1          John          Doe
2             3          1          Peter         Pan
3             7          1          Isaac         Newton

科目

SubjID     SubjCode     YearID
1          English      1
2          Math         1
3          Science      1

出力は...

StudentID     FullName
2             Peter Pan
3             Isaac Newton

以下のSQL文を思いつくことができました(Icさんのおかげです) 。

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName 
FROM Students AS s
LEFT OUTER JOIN EnrollStudents AS es ON s.StudentID = es.StudentID
GROUP BY s.StudentID, s.FirstName, s.LastName 
HAVING COUNT(DISTINCT(es.SubjID)) < (SELECT COUNT(*) FROM Subjects)

件名でクエリをフィルタリングする方法はありますか? 私が英語を選択したとしましょう。Isaac Newton だけが科目を登録できます。

4

3 に答える 3

3

より単純なクエリを使用して、科目に登録されていない学生を見つけることができます。たとえば、次のようになります。

select StudentID,
    FirstName + ' ' + LastName as FullName
from Students
where StudentID not in (
    select es.StudentID
    from EnrollStudents es
    inner join Subjects s on es.SubjID = s.SubjID
    where s.SubjCode = 'English'
)

SQL フィドルの例

次のように、左結合として記述することもできます。

select s.StudentID,
    s.FirstName + ' ' + s.LastName as FullName
from Students s
left outer join (
    select distinct es.StudentID
    from EnrollStudents es
    inner join Subjects s on es.SubjID = s.SubjID
    where s.SubjCode = 'English'
) ss on s.StudentID = ss.StudentID
where ss.StudentID is null
于 2012-07-23T15:39:58.847 に答える
1

あなたのクエリは不必要に複雑だと思います。たとえば、左外部結合は必要ありません。また、having 句でサブクエリを省略することもできます。

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName
FROM Students AS s JOIN
     EnrollStudents AS es
    ON s.StudentID = es.StudentID
GROUP BY s.StudentID, s.FirstName, s.LastName
HAVING COUNT(DISTINCT(es.SubjID)) < COUNT(es.SubjID)

英語のみを取得するには:

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName
FROM EnrollStudents AS es join
     Students AS s
     ON s.StudentID = es.StudentID join
     Subjects su
     on es.subjid = su.subjid
where su.subjcode in ('English')
GROUP BY s.StudentID, s.FirstName, s.LastName
HAVING COUNT(DISTINCT(es.SubjID)) < COUNT(es.SubjID)

単一の主題に限定する場合、「having」句は関係ないと思います。クエリで何をしたいのか説明できますか?

于 2012-07-23T15:46:50.140 に答える
0

これはMySQLでうまくいきました。別の方法で連結する必要がありましたが、魅力のように機能します

SELECT Students.StudentID, CONCAT(Students.FirstName, ' ', Students.LastName) AS FullName
FROM Students, Enrollstudents, Subjects
WHERE Subjects.SubjID = 2 <--- HERE IS THE BIT YOU CHANGE TO FILTER
AND   EnrollStudents.SubjID = Subjects.SubjID
AND   Students.StudentID = Enrollstudents.StudentID

そして、あなたが使用していた concat メソッドで:

SELECT Students.StudentID, Students.FirstName + ' ' Students.LastName AS FullName
FROM Students, Enrollstudents, Subjects
WHERE Subjects.SubjID = 2
AND   EnrollStudents.SubjID = Subjects.SubjID
AND   Students.StudentID = Enrollstudents.StudentID

注: WHERE 句を使用して、必要な操作を行うことができます。特定の科目に登録されていない全員を取得するには、4 行目を次のように変更します。

AND   EnrollStudents.SubjID <> Subjects.SubjID

また

AND NOT  EnrollStudents.SubjID = Subjects.SubjID

(おもう)

于 2012-07-23T16:02:48.103 に答える