2016-04-20 4 views
0

Я пытаюсь преобразовать следующие 2 реляционную алгебру в стандартный английский, но у меня возникли проблемы понять, что именно пересекающей делаетSQL Query пересекающей - реляционная алгебра

Я знаю, что ПЕРЕСЕЧЕНИЕ находит значения, которые происходят в обоих выбранных утверждений

мне удалось найти свой SQL запрос, но я просто не могу понять, что он просит в простом английском

ли кто-нибудь сможет помочь?

Реляционная алгебра:

Πstudent_name(σcourse id=“CS1850“(student Natural Join enrolled)) ∩ 
Πstudent_name(σcourse id=“CS1840“(student Natural Join enrolled)) 

SQL:

SELECT student_name FROM student NATURAL JOIN enrolled WHERE 
course_id='CS1850' INTERSECT SELECT student_name FROM student 
NATURAL JOIN enrolled where student_name='CS1840' 

Второе выражение:

Πstudent_name(σe1.student 
id=e2.student_id∧e1.course_id<>e2.course_id(student natural join 
(ρe1(enrolled) × ρe2(enrolled)))) 

SELECT student_name FROM student NATURAL JOIN enrolled e1 NATURAL JOIN 
e2 WHERE e1.student_id = e2.student_id 
+0

На человеческом языке: «Найдите всех учеников, обучающихся в« CS1850 », и найдите всех учеников, обучающихся в« CS1840 », и верните пересечение этих двух наборов результатов», или «Найдите всех учащихся, включенных в * оба *» CS1850 'и' CS1840 '. " – JimmyB

+0

@JimmyB - Я понимаю - любые идеи о втором? – RandomMath

+0

Второй SQL не соответствует алгебраическому выражению. Ему не хватает «e1.course id <> e2.course». – JimmyB

ответ

0

пихты st, не используйте NATURAL JOIN. Это ошибка, ожидающая появления. Он сопоставляет таблицы, основанные на именах общих столбцов. Он даже не использует правильно объявленные отношения с внешним ключом. Вместо этого используйте USING или ON, чтобы быть в явном виде о столбцах, используемых для соединения.

Во-вторых, вам не нужно INTERSECT. Существует два типичных метода, которые используют GROUP BY или JOIN.

На английском языке запрос получает учащиеся, которые зарегистрированы в обоих классах.

SELECT s.student_name 
FROM student s JOIN 
    enrolled e 
    USING (student_id) -- or whatever 
WHERE e.course_id IN ('CS1850', 'CS1840') 
GROUP BY s.student_name 
HAVING COUNT(*) = 2; 

Примечание: предполагается, что у двух учеников нет одинакового имени.

Альтернативой просто использует JOIN:

SELECT s.student_name 
FROM student s JOIN 
    enrolled e1 
    USING (student_id) JOIN 
    enrolled e2 
    USING (student_id) 
WHERE e1.course_id = 'CS1850' AND 
     e2.course_id = 'CS1840'; 

Если базовые таблицы не имеют дубликаты, то это не нужно GROUP BY или DISTINCT.

+0

Как Query выше или ваш запрос отличаются от выполнения ** WHERE course_id = 'CS1850' AND course_id = 'CS1840' **? – RandomMath

+0

@RandomMath. , , Мой запрос вернет студентов в оба класса. Предложение 'WHERE' всегда будет отфильтровывать всех студентов (потому что' course_id' не может принимать оба значения в одной строке). –

+0

О, я понимаю - Мое выражение полностью загрузилось - есть еще один расширенный запрос, выше которого я не знаю перевода на английский язык – RandomMath