Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.069 c
1-1095234490
X-Disa
2004-09-15 11:48
2004.10.03
Сохранение компонента


1-1095609995
tyus
2004-09-19 20:06
2004.10.03
ProgressBar


8-1088939465
Alex C
2004-07-04 15:11
2004.10.03
видео


3-1094228637
Сергей Ю.
2004-09-03 20:23
2004.10.03
Вопрос про запрос


14-1094843749
мимо идусчий
2004-09-10 23:15
2004.10.03
админы спят





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский