2014-11-11 5 views
0

У меня есть три таблицы Students, Субъектов, RANK, с данными, как -Создать вид путем объединения трех таблиц в SQL

1) STUDENTS [NAME (Primary)]

NAME 
-------- 
Alex 
Greg 

2) SUBJECTS [ID (Основной)]:

ID 
-------- 
100 
101 
102 

3) RANK [SEQ (первичный), NAME, ID, RANK]

SEQ NAME ID  RANK 
------ ------- ------ ------ 
1  Alex 100 A 
2  Greg 100 A 
3  Greg 101 B 

Я хочу, чтобы создать представление, которое должно отображать данные в виде

NAME ID  RANK 
------- ------ ------ 
Alex 100 A 
Alex 101 Z 
Alex 102 Z 
Greg 100 A 
Greg 101 B 
Greg 102 Z 

Таким образом, для каждого студента и для каждого субъекта, вид должен отображать RANK если они присутствуют в RANK стол, иначе замените NULL на 'Z'.

Я новичок в SQL. Поэтому любая помощь в формировании запроса была бы глубоко оценена!

+3

Покажите нам, что вы написали до сих пор. – jurgemaister

+0

Это пахнет домашней работой. – mmmmmpie

ответ

1

перекрестное соединение student и subject, а затем левое внешнее соединение с результатом rank, чтобы получить звание для всех (ученика, предмет). выбор столбца с NVL ИЛИ COALESCE заменит NULL на «z».

SELECT st.name, 
     su.id, 
     NVL(ra.rank,'Z')   Rank, --COALESCE(ra.rank,'Z') Rank 
FROM student st 
     CROSS JOIN subject su 
     LEFT OUTER JOIN rank ra 
        ON ra.name = st.name 
         AND ra.id = su.id 
ORDER BY st.name,su.id 

Примечание: ORDER BY можно удалить из запроса, если вам это не нужно.

fiddle

+0

Вы также можете изменить оператор 'CASE' и использовать' NVL (ra.rank, 'Z'), ' –

+0

спасибо, что заметили. :) либо 'coalesce', либо' nvl' также может это сделать и выглядит лучше. –

0
SELECT r.NAME, r.ID, NVL(r.RANK, 'Z') 
FROM RANK r, studendts st, SUBJECTS su 
WHERE st. NAME = r. NAME 
AND su.ID = r.ID 
ORDER BY 1,2,3 
Смежные вопросы