![]() |
|
Модераторы: LSD |
![]()
|
|
| SID_M |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 11.2.2005 Где: Россия, г. Москва Репутация: нет Всего: нет |
Народ, мастера SQL! Помогите запросик составить...
Есть две таблицы Documents(ID, Name, ...) |___________ | DocumentClassifyers(ID, DocID, ClassifyerID, ...) Есть еще список, состоящий из ClassifyerID... Смысл понятен? Есть документ и у него может быть куча классификаторов. Нужно сделать выборку по списку классификаторов. Т.е. вывести документы у которых есть все классификаторы из списка... В реляционной алгебре для такого дела есть оператор деления, а вот как это дело написать на SQL? Добавлено @ 11:33 Вот блин, пробелы пропускаются... В общем связь Documents.ID -> DocumentClassifyers.DocID А база данных MSAccess... --------------------
Если тебе не дано летать, то хотя бы ползай с гордо поднятой головой. |
|||
|
||||
| Stampede |
|
||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
Это известный подход, когда значения атрибутов хранятся не в виде реляционного отношения, а в виде кучи (heap). Хорош тем, что позволяет добавлять новые атрибуты без изменения структуры таблицы. Запросы, подобные тому, что ты описал, формулируются в виде множественных джойнов к таблице значений (синтаксис для SQL Server):
У данной модели есть ряд ограничений (как, например, необходимость приводить значения разных типов к строковому), которые, впрочем, поддаются обходу ценой всяких ухищрений. С точки зрения производительности, при условии использования СУБД с хорошим оптимизатором и на хорошем железе - при средних объемах данных (в пределах миллиона записей в основной таблице) работает вполне приемлемо. Как будет в Access - без понятия. Успехов |
||||
|
|||||
| SID_M |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 11.2.2005 Где: Россия, г. Москва Репутация: нет Всего: нет |
Идея не сработала, но подход красивый! Спасибо!
--------------------
Если тебе не дано летать, то хотя бы ползай с гордо поднятой головой. |
|||
|
||||
| igon |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 3 Всего: 21 |
Если список, состоящий из ClassifyerID, существует в виде таблицы, скажем, Classifiers, то
- это множество всех потенциально правильных комбинаций DocumentID и ClassifierID (обыкновенное "декартово произведение" двух таблиц) При помощи Intersect (пересечение множеств) отсекаем: 1) несуществующие на данный момент комбинации DocumentID и ClassifierID из "декартова произведения" 2) существующие комбинации DocumentID с "чужим" ClassifierID, т.е. не присутствующим в таблице Classifiers Из полученного пересечения выбираем те ID документов, в группе которых имеется ровно столько записей, сколько записей в таблице Classifiers. Проверял на Oracle. Экзотических конструкций вроде нет -> должно работать и на других БД. -------------------- Хотите поговорить об этом? |
||||
|
|||||
| shilnik |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 377 Регистрация: 22.12.2003 Репутация: нет Всего: 1 |
Немного перефразирую предыдущий пост
|
|||
|
||||
| igon |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 3 Всего: 21 |
to shilnik
К сожалению, перефразировка некорректна В результирующую выборку попадут и документы, у которых КОЛИЧЕСТВО классификаторов (чисто случайно) совпадает с числом записей в Classifiers, но среди них есть "чужие" (см. пункт 2 комментариев). Оно нам надо? А упростить действительно можно:
(просто очень хотелось упоминаемую в вопросе таблицу Documents куда-нибудь "приткнуть" Можно и так
-------------------- Хотите поговорить об этом? |
||||||
|
|||||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |