2017-09-22 8 views
1

クラスに登録されている学生名と別のクラスにも登録する必要があります。しかし、WHEREステートメントを実行すると、他のクラスを持つ他のすべての行が削除されます。複数の文字列を修飾することでSQLを選択

私の質問は、グループ全体を比較し、CLASSAとCLASSBの両方の学生のみを選択するようにするにはどうしたらいいですか?

一部の学生はCLASSAに在籍しており、CLASSBに在籍している学生もあれば、CLASSBに在籍している学生もあれば、両方に在籍している学生もいます。両方にあるものを取得するにはどうすればよいですか?例えば

  • ジョン・スミスはCLASSAである
  • BETTY WHITEはClassBのである
  • ティミー・エドワーズはCLASSAである
  • 私は場合
  • ティミー・エドワーズは、ClassBの

でありますORを使用すると、すべての名前が選択されます。しかし、私は両方のクラスにいる学生だけが欲しい。だからティミーエドワーズは私が選んだのです。

WHERE C.DESCRIPTION LIKE 'Systems Analysis%' 

とC.DESCRIPTION LIKE「プロジェクトマネジメント%」

+1

あなたが持っている、あなたはすでにどのSQL文で試してみたそのテーブルを指定することはできますか? –

+0

もちろん、SELECT S.FIRST_NAME || ' STUDENT FROM「|| S.LAST_NAME、C.DESCRIPTION S JOIN入学E ON(E.STUDENT_ID = S.STUDENT_ID) SECTION SE ON(SE.SECTION_ID = E.SECTION_ID) JOINコースC をJOIN ON (C.COURSE_NO = SE。COURSE_NO)これまでのところ、システム分析とプロジェクト管理のクラスに入っていなければなりません。だから私は個別に、またはOR声明で検索することができます。しかしそれはまだそれらの両方のarentの人々を引き上げる。 – user7410612

+0

申し訳ありませんが、フォーマットはひどいです。それは私のコンピュータ上でもっと良く見える – user7410612

答えて

1

あなたが使用group byhavingを行うことができます。このバージョンでは、生徒は与えられたために、一度だけ登録することができることを前提としてい

select student 
from enrollments 
where class in ('CLASSA', 'CLASSB') 
group by student 
having count(*) = 2; 

クラス。

+0

避けられない重複を取り除くために 'distinct'を追加したいかもしれません。 – Jacobm001

+0

それは働いた!どうもありがとうございます!私はこれを覚えておく必要があります。 Count(*)をいつ使うべきかわからないので、自分でもっと使うようにしなければなりません。ありがとう! – user7410612

+0

@ Jacobm001。 。 。 「必然的な複製」はありません。 –

0

個々の行には、それぞれ、両方のクラスに関する情報がありません。つまり、それらを使用しているのでANDORは無意味です。 EXISTSキーワードを使用して、このような行の有無を確認する必要があります。

select distinct 
    student 
from 
    enrollments 
where 
    exists (
    select 
     1 
    from 
     enrollments e1 
    where 
     e1.student = enrollments.student 
     and e1.class = 'CLASSA' 
) and exists (
    select 
     1 
    from 
     enrollments e2 
    where 
     e2.student = enrollments.student 
     and e2.class = 'CLASSB' 
) 

注:
各行は、その中に生徒の名前を持つことになりますので、私は重複を削除するDISTINCTキーワードを追加しました。

0

あなたは常に巧妙なトリックを試すことができます(正確にあなたのスキーマがどのようなものであるかイムわからないが...)このようなもの、これは支援

WITH a AS 
    (
     SELECT 
     S.FIRST_NAME||' '||S.LAST_NAME [Student] 
     ,C.DESCRIPTION 
     FROM STUDENT S 
     JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
     JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
     JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO) 

     WHERE C.DESCRIPTION = 'CourseA' 
    ) 
    ,b AS 
    (
     SELECT 
     S.FIRST_NAME||' '||S.LAST_NAME [Student] 
     ,C.DESCRIPTION 
     FROM STUDENT S 
     JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
     JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
     JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO) 

     WHERE C.DESCRIPTION = 'CourseB' 
    ) 

    Select a.Student, a.Description [DescA], b.Description [DescB] 
    from a join b on a.Student = b.Student 

    --optional where to just get students in both classes... 
    where a.Description is not null and b.Description is not null 

希望...

+0

申し訳ありませんが、これはsql-serverですので、おそらくmysqlでは機能しません... –

0

を試みることができますSELECT結果を自身に結合し、その結果から選択することができます。

SELECT A.NAME 
FROM (SELECT S.FIRST_NAME||' '||S.LAST_NAME as NAME, 
      S.STUDENT_ID as S_ID, 
      C.DESCRIPTION as DESC 
     FROM STUDENT S 
     JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
     JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
     JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) A 

JOIN (S.STUDENT_ID as S_ID, C.DESCRIPTION as DESC 
     FROM STUDENT S 
     JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
     JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
     JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) B 

ON A.S_ID = B.S_ID 
WHERE A.DESC LIKE 'Systems Analysis%' 
    AND B.DESC LIKE 'Project Management%' 
GROUP BY A.NAME 
関連する問題