SQL SELECT только тогда, когда все элементы совпадают - PullRequest
0 голосов
/ 21 июля 2011

Итак, у меня есть 2 таблицы:

Courses:
-course_ID (primary key)
-course_code
-title

Sections:
-section_ID (primary key)
-course_ID (foreign key)
-day

Каждый курс имеет несколько разделов, которые ему принадлежат.Давайте рассмотрим пример.

Таблицы:

course_ID    course_code    title
1            ABC            Title1
2            BBC            Title2 

section_ID    course_ID    day
1             1            Monday
2             1            Tuesday
3             2            Monday
4             2            Monday

Я хочу иметь возможность выполнить запрос, запрашивающий все курсы, которые дают мне ТОЛЬКО те, в которых все их разделы соответствуютопределенные критерии.Итак, в этом случае, скажем, я хочу увидеть «Все курсы, которые имеют ВСЕ свои разделы в понедельник».Желаемый результат будет:

course_ID    course_code    title    section_ID    day
2            BBC            Title2   3             Monday
2            BBC            Title2   4             Monday

Обратите внимание, как пропущена запись (2, ABC, Title1, 1, Monday)?Кажется, я не могу придумать, как это сделать.Заранее спасибо!

Ответы [ 6 ]

1 голос
/ 21 июля 2011
SELECT * FROM Courses WHERE course_ID NOT IN (SELECT DISTINCT course_ID FROM Sections WHERE day != 'Monday') 
1 голос
/ 21 июля 2011

Попробуйте это:

SELECT  *
  FROM courses c1
WHERE NOT EXISTS
(
    SELECT 1
      FROM  sections c2
      WHERE c1.course_id = c2.course_id
       AND  c2.day <> 'Monday' 
)
0 голосов
/ 21 июля 2011

Вы должны выбрать все разделы с днем ​​= 'понедельник', и из этого результата легко объединить таблицу курсов, чтобы получить курсы.

select distinct c.course_id
    from Courses c
        inner join Sections s on s.course_id = c.course_id
    where s.day = 'Monday';
0 голосов
/ 21 июля 2011
select * from Sections s1 
   where not exists (
       select 1 from Sections s2 
           where s1.course_ID = s2.course_ID and s1.day <> s2.day)

В нем говорится, что нужно тянуть все разделы, в которых запись по одному и тому же курсу не имеет другого дня. Это означает, что вы получаете как отдельные записи, так и несколько записей, если дни совпадают.

0 голосов
/ 21 июля 2011
SELECT c.*
FROM Courses c
WHERE NOT EXISTS (SELECT NULL FROM 
                  Sections s
                  WHERE Day <> Monday
                  and s.CourseID = c.CourseID)
0 голосов
/ 21 июля 2011

Возможно, выбрать курсы там, где их нет (все разделы, кроме разделов, которые удовлетворяют вашим критериям)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...