Как извлечь данные из столбца, если существует только несколько данных для этого значения в другом столбце? - PullRequest
0 голосов
/ 25 февраля 2019

КОД SQL:

select student.sex, class.date 
from ((student INNER JOIN student_course ON student.name=student_course.Student) 
    INNER JOIN class ON student_course.Course=class.Course);

Результат:

sex  date   
m   25.2.19 
m   27.2.19 
m   27.2.19 
m   27.2.19 
m   25.2.19 
m   27.2.19 
m   25.2.19     
f   25.2.19 
f   27.2.19 
f   27.2.19 
f   25.2.19 
f   26.2.19 

Теперь моя цель - получить дату, когда появятся как ученики, так и ученицы.Поэтому я изменил код так:

SELECT o.date 
FROM (  select student.sex, class.date 
        from ((student INNER JOIN student_course ON student.name=student_course.Student) 
        INNER JOIN class ON student_course.Course=class.Course)) AS o 
WHERE o.sex='m' AND o.sex='f';

Результат равен NULL.Но я хочу результат как:

date 
25.2.19
27.2.19

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы можете сделать JOIN с агрегацией, никакой подзапрос не требуется:

select c.date
from student s inner join
     student_course sc
     on s.name = sc.Student inner join
     class c
     on sc.Course = c.Course
where s.sex in ('F', 'M')
group by c.date;

Это отобразит date S, где он найдет male или female, однако ваш пример выводапредлагает:

select c.date
from student s inner join
     student_course sc
     on s.name = sc.Student inner join
     class c
     on sc.Course = c.Course
where s.sex in ('F', 'M')
group by c.date
having count(distinct s.sex) = 2;
0 голосов
/ 25 февраля 2019

Правильный ответ от @Yogesh Sharma SQL CODE:

    select c.date
    from student s inner join
         student_course sc
         on s.name = sc.Student inner join
         class c
         on sc.Course = c.Course
    where s.sex in ('F', 'M')
    group by c.date
    having count(distinct s.sex) = 2;
0 голосов
/ 25 февраля 2019

Если вы хотите, чтобы даты встречались как со студентами, так и со студентами, используйте агрегацию:

select c.date
from student s INNER JOIN
     student_course sc
     ON s.name = sc.Student INNER JOIN
     class c
     ON sc.Course = c.Course
group by c.date
having min(s.sex) = 'F' and max(s.sex) = 'M';

Если у вас есть другие гендеры, тогда вы можете выбрать where s.sex in ('F', 'M'), чтобы логика having работала.

...