2017-09-12 3 views
1

Die Vorbehalt hier ist, ich muss diese komplett mit nur den folgenden Tools:SQL: Alle Zeilen in einer Tabelle, wenn die Zeilen ein Fremdschlüssel in einer anderen Tabelle sind

  1. Das grundlegende SQL-Konstrukt: SELECT FROM .. AS WHERE.. . Eindeutig ist in Ordnung.

  2. Set Betreiber: UNION, INTERSECT, EXCEPT

  3. erstellen temporäre Beziehungen: CREATE VIEW... AS ...

  4. arithmetische Operatoren wie <, >, <=, == usw.

  5. Subquery kann nur im Rahmen von NOT IN oder eine Subtraktion verwendet werden. I.e. (select ... from... where not in (select...)

Ich kann keine join, limit, max, min, count, sum, having, group by, not exists, any exists, count, aggregate Funktionen oder irgendetwas anderes verwenden aufgelistet nicht oben in 1-5.

Schema:

People (id, name, age, address) 

Courses (cid, name, department) 

Grades (pid, cid, grade) 

zufrieden ich die Abfrage aber ich habe nicht existiert (was ich nicht verwenden können). Die SQL unten zeigt nur Leute, die jede Klasse in der Tabelle Kurse nahmen:

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)) 

Gibt es Möglichkeit, dies durch in oder eine andere Methode nicht zu lösen, die ich bin gelassen? Ich habe stundenlang damit zu kämpfen gehabt. Wenn jemand mit diesem doofen Hindernis helfen kann, werde ich Ihre Antwort gerne auffrischen und Ihre Antwort auswählen.

+1

Sie können also‘ t 'Join' oder Aggregatfunktionen verwenden?Vielleicht können Sie 'except' verwenden, um Schüler mit einer unvollständigen Liste zu identifizieren, und dann' NOT IN' dagegen verwenden. –

+0

Wie würde ich herausfinden, wer nicht jeden Kurs in der Kurstabelle genommen hat? Probleme damit –

Antwort

0

Wie Nick.McDermaid sagte Sie except Schüler identifizieren können, die fehlenden Klassen sind und not in sie auszuschließen.

1 Holen Sie sich die vollständige Liste mit einem kartesischen Produkt von people x courses. So sieht grades aus, wenn jeder Schüler jeden Kurs belegt hat.

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

2 Verwenden except Studenten zu identifizieren, die mindestens eine Klasse

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

3 Verwenden not in auszuwählen Studenten fehlen, die keine Klassen fehlen

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

Wie Nick vorschlägt, können Sie EXCEPT in diesem Fall verwenden. Hier ist die Probe:

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

Danke, aber die Select-Anweisung nach EXCEPT zeigt einfach eine Liste von Personen an, die * any * -Kurs in der Kurstabelle genommen haben. Ich muss Leute finden, die entweder * jeden * Kurs in der Kurstabelle ** absolviert haben oder ** Personen finden, die nicht * jeden * Kurs in der Kurstabelle belegt haben. –

0

Sie die ersten not exists in not in mit einem konstanten Wert drehen können.

select * 
from People a 
where 1 not in (
    select 1 
    from courses b 
    ... 
Verwandte Themen