2017-03-21 100 views
2

比方说,我有一个schools表和students表。 students表连接到schools表并具有列NAMEBIRTHDATE学生在学校查询

我需要的所有学校学生在他们里面,谁被称为“吉姆”或“迈克”和出生在同一天。

喜欢的东西:

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

显示我们的DB模式,样本数据和预期产出。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)来了解如何提高您的问题质量并获得更好的答案。 –

+0

你不能用同一个WHERE条款比较同一个表中的不同行,你需要让学生加入学生,或者使用'HAVING'子句。 –

+0

我明白你的意思。你可以向我展示那个解决方案的例子 –

回答

1

可以用拖时间的表相关的生日内穰

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

你可以简单的使用条件聚集找到schoolId S作,以每birthdatejoin的名称(或使用IN)与学校的表来获得相关细节。

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

你会寻找:

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

你可以做到这一点通过与学校学生参加两次

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

这种尝试:

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 
) 

希望这个帮助!

0

另一种形式(我没有测试过)可能是:

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