2017-09-12 5 views
1

警告ここで私が唯一、以下のツールでこれを完了する必要があります:SQL:行が別のテーブルの外部キーである場合に、テーブル内のすべての行を検索

  1. 基本的なSQL構文:SELECT FROM .. AS WHERE.. 。格別です。

  2. 集合演算子:UNION, INTERSECT, EXCEPT

  3. 一時的な関係を作成します。<, >, <=, ==ようCREATE VIEW... AS ...

  4. 算術演算子などを

  5. サブクエリはNOT INのコンテキストまたは減算演算に使用することができます。私。私は上記1-5に記載されていない任意のjoin, limit, max, min, count, sum, having, group by, not exists, any exists, count, aggregate機能または何か他のものを使用することはできません(select ... from... where not in (select..。)

スキーマ

People (id, name, age, address) 

Courses (cid, name, department) 

Grades (pid, cid, grade) 

私は、クエリを満たしたが、私は(私が使用できない)が存在していない使用。

select People.name from People 
where not exists 
(select Courses.cid from Courses 
where not exists 
(select grades.cid from grades 
where grades.cid = courses.cid and grades.pid = people.id)) 

はないでまたはIを使用させていただいております他のいくつかの方法を使用してこれを解決する方法があります:以下のSQLはコーステーブル内のすべてのクラスを取った人だけを示して?私はこれと数時間苦労しました。誰かがこのばかげた障害を助けることができるなら、私は喜んであなたの答えをupvoteし、あなたの答えを選択します。

+1

をすることができます欠落していない学生を選択するために、少なくとも1つのクラス

create view missing_view as select distinct pid from ( select pid, cid from complete_view except select pid, cid from grades ) t 

3使用not inが欠落している学生を識別するために'join'や集約関数を使う?多分、あなたは不完全なリストを持つ生徒を特定するために 'except'を使うことができます。それに対して' NOT IN'を使用します。 –

+0

コーステーブルのすべてのコースを受講しなかった人を見てみるとどうなりますか?問題を抱えている –

答えて

0

Nick.McDermaidは、あなたがそれらを排除するために、クラスとnot inが欠落している学生を識別するためにexceptを使用することができます言ったように。

1カタログ番号people x coursesの完全なリストを入手してください。すべての生徒がすべてのコースを受講した場合、これはgradesのようになります。

create view complete_view as 
    select people.id as pid, courses.id as cid 
    from people, courses 

2使用exceptあなたが「だから、任意のクラス

select * from people where id not in (select pid from missing_view) 
0

ニックが示唆しているように、この場合はEXCEPTを使用できます。

select People.name from People 
EXCEPT 
select People.name from People AS p 
join Grades AS g on g.pid = p.id 
join Courses as c on c.cid = g.cid 
+0

ありがとうございますが、EXCEPTの後のselectステートメントは、コーステーブルで*どのコースも取った人のリストを表示します。私は、コーステーブルのすべての*コースを取った**人を見つける必要があります**または**コーステーブルですべての*コースを取っていない人を見つける。 –

0

あなたが一定の値を使用してnot inに最初not existsを変えることができます:ここではサンプルです。

select * 
from People a 
where 1 not in (
    select 1 
    from courses b 
    ... 
関連する問題