| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Помогите составить запрос! |
| Автор: SID_M 30.4.2005, 11:31 |
| Народ, мастера SQL! Помогите запросик составить... Есть две таблицы Documents(ID, Name, ...) |___________ | DocumentClassifyers(ID, DocID, ClassifyerID, ...) Есть еще список, состоящий из ClassifyerID... Смысл понятен? Есть документ и у него может быть куча классификаторов. Нужно сделать выборку по списку классификаторов. Т.е. вывести документы у которых есть все классификаторы из списка... В реляционной алгебре для такого дела есть оператор деления, а вот как это дело написать на SQL? Добавлено @ 11:33 Вот блин, пробелы пропускаются... В общем связь Documents.ID -> DocumentClassifyers.DocID А база данных MSAccess... |
| Автор: Stampede 2.5.2005, 20:43 | ||||
Это известный подход, когда значения атрибутов хранятся не в виде реляционного отношения, а в виде кучи (heap). Хорош тем, что позволяет добавлять новые атрибуты без изменения структуры таблицы. Запросы, подобные тому, что ты описал, формулируются в виде множественных джойнов к таблице значений (синтаксис для SQL Server):
У данной модели есть ряд ограничений (как, например, необходимость приводить значения разных типов к строковому), которые, впрочем, поддаются обходу ценой всяких ухищрений. С точки зрения производительности, при условии использования СУБД с хорошим оптимизатором и на хорошем железе - при средних объемах данных (в пределах миллиона записей в основной таблице) работает вполне приемлемо. Как будет в Access - без понятия. Успехов |
| Автор: SID_M 4.5.2005, 10:00 |
| Идея не сработала, но подход красивый! Спасибо! |
| Автор: igon 5.5.2005, 00:37 | ||||
Если список, состоящий из ClassifyerID, существует в виде таблицы, скажем, Classifiers, то
- это множество всех потенциально правильных комбинаций DocumentID и ClassifierID (обыкновенное "декартово произведение" двух таблиц) При помощи Intersect (пересечение множеств) отсекаем: 1) несуществующие на данный момент комбинации DocumentID и ClassifierID из "декартова произведения" 2) существующие комбинации DocumentID с "чужим" ClassifierID, т.е. не присутствующим в таблице Classifiers Из полученного пересечения выбираем те ID документов, в группе которых имеется ровно столько записей, сколько записей в таблице Classifiers. Проверял на Oracle. Экзотических конструкций вроде нет -> должно работать и на других БД. |
| Автор: shilnik 5.5.2005, 12:23 | ||
Немного перефразирую предыдущий пост
|
| Автор: igon 6.5.2005, 05:04 | ||||||
| to shilnik К сожалению, перефразировка некорректна В результирующую выборку попадут и документы, у которых КОЛИЧЕСТВО классификаторов (чисто случайно) совпадает с числом записей в Classifiers, но среди них есть "чужие" (см. пункт 2 комментариев). Оно нам надо? А упростить действительно можно:
(просто очень хотелось упоминаемую в вопросе таблицу Documents куда-нибудь "приткнуть" Можно и так
|