2015-12-20 5 views
1

Я пытаюсь имитировать запрос (для академической цели)Ошибка при попытке имитировать пересечение

(select course_id from section where semester = 'Spring' and year = 2010) 
intersect 
(select course_id from section where semester = 'Fall' and year = 2009) 

успешно имитировали с

select t.course_id from section t, section s where s.course_id = t.course_id and 
s.semester = 'Spring' and s.year = 2010 and t.semester = 'Fall' and t.year = 2009; 

и когда я попробовал эти,

select t.course_id from section t, section s where s.course_id = t.course_id and 
(s.semester, s.year, t.semester,t.year) in ('Spring',2010,'Fall',2009); 

ошибка в скобках после in predica т.е (согласно строке и колонке , указанной в ошибке), ошибка ORA-00920: Недопустимый реляционная оператор 00920. 00000 - "неверный оператор отношения"

Затем я попытался

select t.course_id from section t, section s where 
s.course_id = t.course_id and (s.semester,s.year) = ('Spring',2010) 
and (t.semester, t.year) in ('Fall',2009); 


select t.course_id from section t, section s where 
s.course_id = t.course_id and ((s.semester,s.year) in ('Spring',2010)) 
and ((t.semester, t.year) = ('Fall',2009)); 

с различной комбинацией in и = получать ту же ошибку в круглых скобках после первого in или =

есть ли предел в м атрибуты для (..) in/= (...) или использование одной и той же таблицы вызывает эту или некоторые другие причины?

Использование Oracle 12c.

ответ

1

Прежде всего прекратите использование «синтаксиса соединения запятой». Он устарел и имеет большого преемника по имени JOIN. Вы можете прочитать здесь: INNER JOIN ON vs WHERE clause.

Во-вторых вам нужно обернуть значение с другой парой круглых скобок: «? Почему нужны дополнительные круглые скобки»

SELECT t.course_id 
FROM section t 
JOIN section s 
    ON s.course_id = t.course_id 
WHERE (s.semester, s.year, t.semester,t.year) IN (('Spring',2010,'Fall',2009)); 

SqlFiddleDemo

Вы можете спросить, подумайте о нескольких в IN:

WHERE (col1, col2, col3, col4) IN ((1,2,3,4), (5,6,7,8), (9,10,11,12)) 

Ваше замешательство может быть вызвано одним значением, как:

WHERE col IN (1,2,3); 
<=> 
WHERE (col) IN ((1), (2), (3)); 
+0

Запятая присоединиться, или CROSS JOIN, это не то же самое, как только JOIN. – Shredderroy

+0

@Shredderroy Я ссылаюсь на 'из раздела t, раздел s, где s.course_id = t.course_id', где соединение выполняется в предложении WHERE. Конечно, без 'WHERE' вы получите декартовское произведение. – lad2025

+0

@ lad2025 вы можете ссылаться на любую книгу, которая обеспечивает глубокие знания SQL, документация оракула слишком продвинута для меня – Sab

Смежные вопросы