2017-03-21 5 views
2

Nehmen wir an, ich habe eine schools Tabelle und eine Tabelle. Die Tabelle ist mit der Tabelle schools verbunden und hat die Spalten NAME und BIRTHDATE.Schüler in der Schule Abfrage

Ich brauche alle Schulen die Studenten in sich haben, die „jim“ oder „mike“ und geboren am selben Tag genannt werden.

Etwas wie:

select * 
    from schools s 
    join student st in st.schoolId = s.Id 
    where (...) 
+0

Zeigen Sie uns DB-Schema, Beispieldaten und erwartete Ausgabe. \t Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –

+0

Sie können verschiedene Zeilen in der gleichen Tabelle nicht mit einer 'WHERE'-Klausel vergleichen, Sie müssen Studenten mit Studenten verbinden oder eine' HAVING'-Klausel verwenden. –

+0

Ich bekomme Sie..können Sie mir ein Beispiel für diese Lösung zeigen –

Antwort

1

Konnten die Tabellen im Zusammenhang inneren joi von birth Schlepptau Zeit verwenden

select t1.id from ( 
    select s.id , st.name, st.birthdate 
    from schools s 
    join student st in st.schoolId = s.Id 
    where st.name = 'jim' 
) t1 
inner join ( 
    select s.id , st.name, st.birthdate 
    from schools s 
    join student st in st.schoolId = s.Id 
    where st.name = 'mike' 
) t2 on t1.birthdate = t2.birthdate 
1

Sie einfach bedingte Aggregation können die schoolId s zu finden, die sowohl die Namen pro birthdate und join (oder benutzen Sie IN) haben mit Schulen Tabelle werden die relevanten Details zu erhalten.

select s.* 
from schools s 
join (
    select distinct schoodId 
    from student 
    where name in ('jim', 'mike') 
    group by schoodId, 
     birthdate 
    having count(distinct name) = 2 
    ) st on s.Id = st.schoodId; 
1

Sie suchen würde:

select s.* 
from schools s 
    cross apply (select birthdate, name from students st where st.schoolId = s.Id and st.name = 'Jim') studentJim 
    cross apply (select birthdate, name from students st where st.schoolId = s.Id and st.name = 'Mike') studentMike 
where studentJim.birthDate = studentMike.birthDate 
2

Sie tun können, dass die Schüler mit Schulen zweimal

select distinct s.* 
from schools s 
join student st1 
on  st.schoolId = s.Id 
join student st2 
on  st.schoolId = s.Id 
where st1.birthdate = st2.birthdate and 
     st1.name = 'Jim' and 
     st2.name = 'Mike' 
0

mit diesem Versuchen durch den Beitritt:

select * from schools 
where schools.id IN (

(select 
    s1.schoolID 
from 
    student s1 inner join student s2 
    on 
     (s1.schoolID = s2.schoolID) --seem school 
     AND (s1.birthdate = s2.birthdate) --seem birthdate 
     AND ((s1.name like '% jim %') OR (s1.name like '% mike %'))) --name jim or mike 
) 

Hoffnung diese Hilfe!

0

Eine andere Form (ich habe es nicht getestet) könnten sein:

SELECT * 
FROM SCHOOLS S 
INNER JOIN (
      SELECT A.SCHOOL_ID 
      FROM STUDENT A 
      INNER JOIN STUDENT B ON A.BIRTHDATE = B.BIRTHDATE AND A.SCHOOL_ID= B.SCHOOL_ID 
      WHERE A.NAME = 'JIM' 
      AND B.NAME = 'MIKE' 
      ) C ON S.ID = C.SCHOOL_ID 
Verwandte Themen