Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Операция пересечения в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
11-1081013613
mehos
2004-04-03 21:33
2004.10.03
Ширина выводимой меню, при OwnerDraw=true


14-1095016210
Vasya.ru
2004-09-12 23:10
2004.10.03
Не пойму логики кода


1-1095228689
Fedia
2004-09-15 10:11
2004.10.03
Синхронизация в потоке


6-1090762509
Lucifer
2004-07-25 17:35
2004.10.03
Что-то непонятное с TidTCPServer и TidTCPClient


6-1090693107
AlexeyM
2004-07-24 22:18
2004.10.03
Исходник проги