Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Операция пересечения в 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]

Помоему изначально неправильный подход, база не нормализована, помоему необходимо создать три таблицы, таблица списка предметов, таблица списка специальностей и таблица сообветствия специальности и предметов


Наверх

Титульная страница Поиск, карта сайта Написать письмо