Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

запрос Sql....не работает

15K
27 декабря 2005 года
Машаня
2 / / 27.12.2005
Помогите пожалуйста с запросом. Не работает. Преподователь сказал ,что все ок. Такое может существовать. А на практике не работает, ссылается на "exists".
Пишу в Делфи ,через ДатаБейз и Query.

Код:
select Учитель.ФИО
from Учитель
where Учитель <> «Сидоров Сидор Сидорович» exists
(select *
from Преподает. Z
where Учитель.№_пасп = Z.№_пасп and
exists
( select *
from Преподает. Y
where Z.№_кл = Y.№_кл and
exists
( select *
from Учитель. Х
where Y.№_пасп = Х.№_пасп and
Х.ФИО = «Сидоров Сидор Сидорович» )))


Звучит так:

Найти Ф.И.О. учителей, которые преподают какие-либо предметы в тех же классах, что и Сидоров Сидор Сидорович.

Алгоритм его таков:
Код:
Находим Номер удостоверения учителя Сидорова Сидора Сидоровича.

Учитель
№_пасп ФИО тел
1234 Харитон Наум Абрамович 456-21-32
5678 Кудинова Елена Викторовна 222-22-22
9101 Пашетова Маргарита Юрьевна 741-85-25
1121 Гостев Алексей Сергеевич 963-36-96
1314 Сидоров Сидор Сидорович 852-25-85
1516 Хряков Виталий Владимирович 455-78-12

Найдем Номера классов в таблице «Преподает», в которых преподает учитель с (№_пасп) 1314.

Преподает
№_кл №_пасп наз_ пр
3 5678 Музыка
3 9101 Литература
3 1121 Французский
4 1234 Литература
4 5678 Музыка
5 1314 Физика
7 1516 Литература
7 1121 Французский
5 5678 Музыка
9 1234 Французский
9 9101 Москвоведение
9 1516 Литература
9 5678 Музыка

В результате получим:
№_кл
5

Далее найдем все НУ учителей, которые преподают в тех же классах, что и 1314 (Сидоров).

Преподает
№_кл №_пасп наз_ пр
3 5678 Музыка
3 9101 Литература
3 1121 Французский
4 1234 Литература
4 5678 Музыка
5 1314 Физика
7 1516 Литература
7 1121 Французский
5 5678 Музыка
9 1234 Французский
9 9101 Москвоведение
9 1516 Литература
9 5678 Музыка

Тогда имеем:
№_пасп
5678

Найдем Ф.И.О. учителей, которые совпадают с найденными НС, Ф.И.О. которых не равно Сидоров Сидор Сидорович.

Учитель
№_пасп ФИО тел
1234 Харитон Наум Абрамович 456-21-32
5678 Кудинова Елена Викторовна 222-22-22
9101 Пашетова Маргарита Юрьевна 741-85-25
1121 Гостев Алексей Сергеевич 963-36-96
1314 Сидоров Сидор Сидорович 852-25-85
1516 Хряков Виталий Владимирович 455-78-12

В результате получим:
ФИО
Кудинова Елена Викторовна


И поясните пожалуйста, как в SQL описывается UBDATE. Не совсем понимаю смысл этой функции. И как это в примере выглядит.
2
27 декабря 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Машаня

Код:
select Учитель.ФИО
from Учитель
where Учитель <> «Сидоров Сидор Сидорович» exists
(select *
from Преподает. Z
where Учитель.№_пасп = Z.№_пасп and
exists
( select *
from Преподает. Y
where Z.№_кл = Y.№_кл and
exists
( select *
from Учитель. Х
where Y.№_пасп = Х.№_пасп and
Х.ФИО = «Сидоров Сидор Сидорович» )))


а какая используется СУБД? она может не поддерживать такие подзапросы.

15K
27 декабря 2005 года
Машаня
2 / / 27.12.2005
Цитата:
Originally posted by squirL
а какая используется СУБД? она может не поддерживать такие подзапросы.



Использую Парадокс в Делфи. Там далее через DataSoures.

С этим как таковым я справилась. Но у меня теперь другая беда, апдейт не работает. Выдает ошибку Token:update

Не пойму в чем дело.

select prepodaet.name_pr
from prepodaet where exists
(select *
from vedet x where prepodaet.nom_pasp = x.nom_pasp
and x.name_gr = "Chebyrashka")

update prepodaet set name_pr = 'Muzik'
where name_pr = 'French' in (select prepodaet.name_pr
from prepodaet where exists
(select *
from vedet x where prepodaet.nom_pasp = x.nom_pasp
and x.name_gr = "Chebyrashka"))

929
30 декабря 2005 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by Машаня
Использую Парадокс в Делфи. Там далее через DataSoures.

С этим как таковым я справилась. Но у меня теперь другая беда, апдейт не работает. Выдает ошибку Token:update

Не пойму в чем дело.

select prepodaet.name_pr
from prepodaet where exists
(select *
from vedet x where prepodaet.nom_pasp = x.nom_pasp
and x.name_gr = "Chebyrashka")

update prepodaet set name_pr = 'Muzik'
where name_pr = 'French' in (select prepodaet.name_pr
from prepodaet where exists
(select *
from vedet x where prepodaet.nom_pasp = x.nom_pasp
and x.name_gr = "Chebyrashka"))


Странный какой-то синтаксис...
Может я чего не понимаю, но обычно, если хотят проверить, входит ли значение в множество, то пишут так:
where значение in (select ...)
где (в Вашем случае) в качестве значения пишут либо name_pr, либо 'French' (но не name_pr='French').
Если хотят проверить, существует ли хоть одна запись, удовлетворяющая некоторым условиям, то пишут:
where exists (select ...)
причем перед exists не надо писать Учитель <> «Сидоров Сидор Сидорович».
И еще полезная ссылка http://www.sql-ex.ru/help/

С уважением, Валера.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог