Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизОперация пересечения в SQL-запросе. Найти похожие ветки
← →
Heretic © (2004-09-02 10:09) [0]Помогите разобраться
Есть база, отражающая какие предметы должны изучать группы специальностей в институте.
Например:
-----------------------------------------
Специальность Предмет
-----------------------------------------
АПП Правоведение
АПП Станкостроение
АПП Материалы
ИТ Правоведение
ИТ САПР
МОТ Правоведение
и т.д...
В запросе необходимо отобрать общие предметы по определенным специальностям. В результате должно получиться: Общие предметы по специальностям «АПП», «ИТ», «МОТ»: «Правоведение».
При попытке написать запрос:
-------Вид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?
← →
Rule © (2004-09-02 10:34) [1]Помоему изначально неправильный подход, база не нормализована, помоему необходимо создать три таблицы, таблица списка предметов, таблица списка специальностей и таблица сообветствия специальности и предметов
← →
Rule © (2004-09-02 10:37) [2]Второй момент, если ты не знаешь количество специальностей заранее, то тебе прийдется формировать запрос динамически
← →
Rule © (2004-09-02 10:52) [3]Давай дальше разбиратся допустим таблица первая специальноестей 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 11:14) [4]Таким образом возвращаемся к задаче выбора предметов, которые есть во всех специальностях
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 11:40) [5]Ау, тут есть кто, это воообще надо комуто кроме меня ?
← →
Heretic © (2004-09-02 16:54) [6]>Rule
Я приношу извинения за отсутствие – отлучался от компьютера.
Я Вас понял, и вся база у меня именно так и выглядит: «Предметы.db», «Специальности.db» и «Изучение.db». Надо получить только одинаковые предметы определенных специальностей
← →
oldman © (2004-09-02 17:17) [7]Select * from base.db where predmet = "ченадо";
Если больше 1 записи в запросе - больше одной группы изучает этот предмет.
:)))
← →
Heretic © (2004-09-02 17:34) [8]oldman
Я не знаю какой именно предмет «ченадо». Я хочу получить в результате КАКИЕ предметы являются ОБЩИМИ в выбранных мною специальностях.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.061 c