![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Операция пересечения в SQL-запросе. [D7, Paradox]
Heretic © (2004-09-02 10:09:00)Помогите разобраться
Есть база, отражающая какие предметы должны изучать группы специальностей в институте.
Например:
-----------------------------------------
Специальность Предмет
-----------------------------------------
АПП Правоведение
АПП Станкостроение
АПП Материалы
ИТ Правоведение
ИТ САПР
МОТ Правоведение
и т.д...
В запросе необходимо отобрать общие предметы по определенным специальностям. В результате должно получиться: Общие предметы по специальностям «АПП», «ИТ», «МОТ»: «Правоведение».
При попытке написать запрос:
-------Вид1
Select Predmet
From «Basa.db»
Where
(Specialnost=«АПП»)
OR (Specialnost=«ИТ»)
OR (Specialnost=«МОТ»)
и т.д.
-------
выводятся вообще все предметы изучаемые той или иной специальностью. Это логично, но мне нужен другой результат (см. выше).
Запрос получается такой:
-----------Вид2
Select Predmet
From «Basa.db»
Where (Specialnost=«АПП»)
INTERSECT Select Predmet
From «Basa.db»
Where (Specialnost=«ИТ»)
INTERSECT Select Predmet
From «Basa.db»
Where (Specialnost=«МОТ »)
и т.д.
----------
Проблема в том, что я заранее не знаю количества специальностей, а запрос получается громоздкий
Нельзя ли как-нибудь изменить запрос Вид1, просто используя AND, OR, NOT?
Heretic (2004-09-02 17:34:00) [1]oldman
Я не знаю какой именно предмет «ченадо». Я хочу получить в результате КАКИЕ предметы являются ОБЩИМИ в выбранных мною специальностях.
oldman (2004-09-02 17:17:00) [2]Select * from base.db where predmet = 'ченадо';
Если больше 1 записи в запросе - больше одной группы изучает этот предмет.
:)))
Heretic (2004-09-02 16:54:00) [3]>Rule
Я приношу извинения за отсутствие – отлучался от компьютера.
Я Вас понял, и вся база у меня именно так и выглядит: «Предметы.db», «Специальности.db» и «Изучение.db». Надо получить только одинаковые предметы определенных специальностей
Rule (2004-09-02 11:40:00) [4]Ау, тут есть кто, это воообще надо комуто кроме меня ?
Rule (2004-09-02 11:14:00) [5]Таким образом возвращаемся к задаче выбора предметов, которые есть во всех специальностях
select a.name from "Predmets" a where (select count(b.id) from spets b)=(select count(c."ID_spets") from soot c where c."ID_predmets"=a.id)
вот такой запроски получается, имена можешь менять, тоесть мы получили список всех предметов котоыре есть во всех специальностях, а если надо список предметов которые есть в определенных специальностях, то надо сделать так
Rule (2004-09-02 10:52:00) [6]Давай дальше разбиратся допустим таблица первая специальноестей SPETS имеет вид
ID - уникальный номер специальности
NAME - название специальности
Таблица предметов PREDMETS имеет вид
ID - уникальный номер предмета
NAME - название предмета
таблица соответствий SOOT имеет вид:
ID - уникальный номер записи
ID_SPETS - номер специальности
ID_PREDMET - номер предмета
Таким образом для выыбора таблицы соответсивий с именами надо
select a.id, b.name, c.name from soot a, spets b, predmet c where a.ID_SPETS=b.id and a.id_predmet=c.id
Rule (2004-09-02 10:37:00) [7]Второй момент, если ты не знаешь количество специальностей заранее, то тебе прийдется формировать запрос динамически
Rule (2004-09-02 10:34:00) [8]Помоему изначально неправильный подход, база не нормализована, помоему необходимо создать три таблицы, таблица списка предметов, таблица списка специальностей и таблица сообветствия специальности и предметов