0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 19
1

SQL запрос внутри таблицы с унарной связью

05.04.2013, 16:32. Показов 2150. Ответов 4
Метки нет (Все метки)

Всем привет, предположим у нас есть таблица Преподаватели. Как видите тут есть унарная связь по столбцам "номер_преподавателя" и "подчиняется". Как записать запрос, который выводил бы, например, список преподавателей, не имеющих подчиненных? Подскажите plz.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE ПРЕПОДАВАТЕЛИ
   (НОМЕР_ПРЕПОДАВАТЕЛЯ    NUMBER(5) NOT NULL,
    ФАМИЛИЯ NVARCHAR2(20)  NOT NULL,
    ИМЯ NVARCHAR2(10) NOT NULL,
    ОТЧЕСТВО  NVARCHAR2(15) NOT NULL,
    ДАТА_КОНТРАКТА  DATE DEFAULT (sysdate),
    НОМЕР_ТЕЛЕФОНА NVARCHAR2(15) NOT NULL,
    ДОЛЖНОСТЬ  VARCHAR2(20) NOT NULL,
    КАФЕДРА  VARCHAR2(10) NOT NULL, 
    ПОДЧИНЯЕТСЯ  NUMBER(5),
    ЗАРПЛАТА  NUMBER(7, 2) NOT NULL,
    CHECK(КАФЕДРА LIKE 'Кафедра%'),  
     FOREIGN KEY(ПОДЧИНЯЕТСЯ) 
     REFERENCES ПРЕПОДАВАТЕЛИ(НОМЕР_ПРЕПОДАВАТЕЛЯ),
     PRIMARY KEY(НОМЕР_ПРЕПОДАВАТЕЛЯ));
Ну и для заполнения:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
INSERT INTO  ПРЕПОДАВАТЕЛИ
VALUES (4002 ,'Костыркин' ,'Олег' ,'Владимирович' ,
                  TO_DATE('1-сен-1997', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-71' ,'Профессор' ,'Кафедра 1' , NULL ,4000);
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4001 ,'Викулина' ,'Валентина' ,'Ивановна' ,
                  TO_DATE('1-апр-1998', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                   '2-46-89-70' ,'Доцент' ,'Кафедра 1' ,4002 ,3000  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4006 ,'Соколов' ,'Петр' ,'Николаевич' ,
                  TO_DATE('1-фев-1978', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                   '2-46-89-75' ,'Ассистент' ,'Кафедра 1' ,4001 ,1500  );
INSERT INTO  ПРЕПОДАВАТЕЛИ
VALUES (4003 ,'Казанко' ,'Виталий' ,'Владимрович' ,
                  TO_DATE('1-сен-1988', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-73' ,'Преподаватель' ,'Кафедра 1' ,4006 ,2000  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4008 ,'Абдулов' ,'Семен' ,'Антонович' ,
                  TO_DATE('1-июн-1988', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-78' ,'Доцент' ,'Кафедра 2' ,NULL ,3000  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4007 ,'Студейкин' ,'Андрей' ,'Андреевич' ,
                   TO_DATE('1-май-1979', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                   '2-46-89-78' ,'Доцент' ,'Кафедра 2' ,4008 ,2500  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4005 ,'Загарийчук' ,'Игорь' ,'Дмитриевич' ,
                  TO_DATE('1-сен-1977', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-78' ,'Ассистент' ,'Кафедра 2' ,4008 ,2000  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4004 ,'Позднякова' ,'Любовь' ,'Алексеевна' ,
                  TO_DATE('10-май-1979', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-72' ,'Преподаватель' ,'Кафедра 2' ,4005 ,2500  );
INSERT INTO ПРЕПОДАВАТЕЛИ
VALUES (4009 ,'Тарасова' ,'Людмила' ,'Алексеевна' ,
                  TO_DATE('20-май-1981', 'dd-Mon-yyyy','NLS_DATE_LANGUAGE=RUSSIAN') ,
                  '2-46-89-72' ,'Преподаватель' ,'Кафедра 2' ,4008 ,2000  );
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2013, 16:32
Ответы с готовыми решениями:

SQL-запрос с циклической связью
Имеется две таблицы ИЗДЕЛИЕ и КОМПОНЕНТЫ (см. рис.) ИЗДЕЛИЕ имеет поля КОД_ИЗДЕЛИЯ и...

C++ Builder + Firebird 2.1, запрос SELECT для таблицы с рекурсивной связью
Здравствуйте. Буду рад помощи в решении следующей проблемы. В базе Firebird есть 2 таблицы - city...

Сложный запрос с JOIN внутри таблицы
Задача следующая. Есть таблица Международной Классификации Болезней (МКБ 10). 23000 записей. В ней...

Отображение массива внутри таблицы Ms Sql для PowerBI
Есть две таблицы в базе Ms Sql, в одной хранятся Id в виде массива в квадратных скобках,...

4
1561 / 1039 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
05.04.2013, 17:02 2
not exists, not in или обычный left join на ваш выбор.
1
Модератор
4140 / 2982 / 567
Регистрация: 21.01.2011
Сообщений: 12,956
05.04.2013, 17:02 3
SQL
1
2
3
4
5
6
7
SELECT *
FROM ПРЕПОДАВАТЕЛИ T1
WHERE NOT EXISTS
   (SELECT 1
    FROM ПРЕПОДАВАТЕЛИ T2
    WHERE  ПОДЧИНЯЕТСЯ = T1.НОМЕР_ПРЕПОДАВАТЕЛЯ
   )
PS
Не рекомендую в Oracle называть таблицы, колонки таблиц и вообще любые объекты на русском языке. Формального запрета нет, но чревато тем, что нарвешься на баг. Причем хорошо, если это будет в начале разаботки проекта, а не ближе к концу.
1
1312 / 944 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
05.04.2013, 19:39 4
а разве не достаточно проверить на null? ведь ссылка на себя же, то есть если не null - гарантированно есть начальник?
0
1561 / 1039 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
05.04.2013, 19:52 5
Надо тех, у кого нет подчиненных, а не у кого есть начальник.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2013, 19:52
Помогаю со студенческими работами здесь

Как логи W2k Server писать в таблицы MS SQL? (cм внутри)
Извините может я и не туда но Господа, задача следующая. Есть сервер (доменный контроллер) с...

SQL Запрос связи таблицы
Всем привет, помогите разобрать данный SQL Запрос что означает точка, INNER JOIN, ON, = . SELECT...

SQL запрос на создание таблицы !
Подскажите вот начал делать таблицу и нужно, что бы в таблице Заказчик ID firm был FK связанный с...

SQL запрос на три таблицы
Здравствуйте! Помогите написать SQL запрос... Список форумов -> темы в определенном форуме ->...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru