Главная страница
    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.039 c
14-1094822954
jack128
2004-09-10 17:29
2004.10.03
Как скопировать содержимое окна CPU


4-1093114982
Thinker
2004-08-21 23:03
2004.10.03
Какая функция возвращает количество свободной оперативной памяти


14-1095319477
xman
2004-09-16 11:24
2004.10.03
компоненты для D6


11-1081274763
Михаил
2004-04-06 22:06
2004.10.03
Редактор ресурсов


3-1094620430
BanderLog_t
2004-09-08 09:13
2004.10.03
Blob-поля больших размеров.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский