Инвертирование запроса или другое

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
MZX
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.10.2004 (Пт) 10:43

Инвертирование запроса или другое

Сообщение MZX » 11.10.2004 (Пн) 8:04

Приветствую.
Поиск ничего не дал, поэтому обращаюсь.

Столкнулся с такой ситуацией, не знаю, как построить выборку.
Есть таблицы Workers, Groups, WorkersByGroup (поля таблиц ниже). Задача такая: как выбрать рабочих, которые НЕ состоят ни в одной группе?
Если подробнее, то у меня в БД есть:
• рабочие 1.Иванов, 2.Петров, 3.Сидоров, 4.Пупкин, 5.Сиськин
• группы 1.Медиа,2.Салон,
• Иванов и Петров принадлежат группам 1 и 2, а Сидоров, Пупкин и Сиськин - нет. Так вот как построить выборку, чтобы в списке оказались Сидоров, Пупкин и Сиськин?

Спасибо.

Поля в таблице Workers:
WorkerID
WorkerNAME
WorkerADDRESS

Поля в таблице Groups:
GroupID
GroupNAME
WorkerID

Поля в таблице WorkersByGroup:
GroupID
WorkerID

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 11.10.2004 (Пн) 8:11

Хорошо бы еще посмотреть и на наполнение таблиц. 8)
Один рабочий может принадлежать только к одной группе единомоментно? А накапливается ли история назначений рабочих в группы? На мой поверхностный взгляд -- схема данных избыточна. :?

MZX
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.10.2004 (Пт) 10:43

Сообщение MZX » 11.10.2004 (Пн) 8:53

Leon_ писал(а):Один рабочий может принадлежать только к одной группе единомоментно?

Да.

Leon_ писал(а):А накапливается ли история назначений рабочих в группы?

Нет, но эта возможность тоже нужна. Пока не знаю, как это оформить (еще одна таблица? Поле в таблицу Workers... не знаю). Подумал, что можно сделать поле WorkerGroup и в него прописывать его группу, но получается совсем какой-то бардак :?

Leon_ писал(а):На мой поверхностный взгляд -- схема данных избыточна. :?

Серьезно? А что не так в схеме?

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 11.10.2004 (Пн) 9:06

Чтобы что-то серъезно советовать -- нужно знать задачи детально. В т.ч. и в песпективе. Для учета назначений объектов в группы могу порекомендовать схему
Workers{WorkerID|WorkerFields|...} -- Appointments{Appointment_ID|WorkerID|GroupID|DateOfAppointment} -- Groups{Group_ID|GroupFields|...}
Но в этом случае рабочие назначаются в группу один раз и уже не могут быть освобожденными -- только назначение в следущую группу. Не самый универсальный совет, в общем.

MZX
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.10.2004 (Пт) 10:43

Сообщение MZX » 11.10.2004 (Пн) 9:30

Leon_ писал(а):Не самый универсальный совет, в общем.


Спасибо, буду думать.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.10.2004 (Пн) 9:55

В общем, запрос должен быть такой (выбрать всех рабочих которые не входят ни в одну группу):

Код: Выделить всё
SELECT * FROM Workers
    WHERE WorkerID NOT EXISTS(
        SELECT * FROM WorkersByGroup
            WHERE WorkerID = Workers.WorkerID)


P.S. Тут все элементарно...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 11.10.2004 (Пн) 9:59

Andrey Fedorov писал(а):P.S. Тут все элементарно...

Угу... Это да...

А у меня еще вопрос-замечание к Leon_
А зачем в таблице Appointments поле Appointment_ID? Предложение по поводу того, что в группах не должно быть Worker_ID - это правильно. Но вот в Appointments разве Worker_ID + Group_ID не будут уникальным ключом?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 11.10.2004 (Пн) 10:22

Rainbow писал(а):А зачем в таблице Appointments поле Appointment_ID? Предложение по поводу того, что в группах не должно быть Worker_ID - это правильно. Но вот в Appointments разве Worker_ID + Group_ID не будут уникальным ключом?

Не будут. Никто не мешает назначить рабочего в группу повторно -- поэтому будет и повторная комбинация Worker_ID + Group_ID. 8) Конечно, тройка значений Worker_ID + Group_ID+DateOfAppointment может быть уникальным ключом. Но это не очень хорошо -- в таблице из трех полей все три загонять в ключ. Во-первых, индекс будет "тройной", во-вторых -- поиск нужной записи будет сложнее:
Код: Выделить всё
"SELECT * FROM bla-bla-bla WHERE Worker_ID =? AND Group_ID=?? AND DateOfAppointment = ???"

Да что тут объяснять, сами все понимаете :lol:
Поэтому -- если, конечно, не стоит задача создать суперкомпактную БД-- "золотое правило": одна таблица -- один ключ.
Опять, повторюсь, не универсальный вариант.

MZX
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.10.2004 (Пт) 10:43

Сообщение MZX » 11.10.2004 (Пн) 10:25

Andrey Fedorov писал(а):В общем, запрос должен быть такой...


Access у меня спотыкается на команде NOT EXISTS:
Ошибка синтаксиса в выражении WorkersID NOT EXISTS (и далее) :(

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.10.2004 (Пн) 10:32

Пиши так:

Код: Выделить всё
SELECT * FROM Workers  WHERE NOT EXISTS(SELECT * FROM WorkersByGroup WHERE WorkerID = Workers.WorkerID)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 11.10.2004 (Пн) 10:38

Leon_ писал(а):Не будут. Никто не мешает назначить рабочего в группу повторно -- поэтому будет и повторная комбинация Worker_ID + Group_ID.

А, кхм... Зачем же рабочего повторно назначать в группу? Это если с первого раза не понял? :) По-моему так, повторное назначение - это ошибка... Ладно, в принципе, это вопрос к разработчику - нормальная это ситуация или нет...

Leon_ писал(а):Да что тут объяснять, сами все понимаете

Я просто расставляю точки над i.
А обрашаться ко мне лучше на "ты" - у нас, вроде, так принято на форуме... Я тут не исключение :lol:
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 11.10.2004 (Пн) 10:47

Форум -- это место, где говорят не тет-а-тет, а обращаются к аудитории :lol:
Назначение объектов в группы -- процесс динамический. После прошествия некоторого времени сотрудник может быть снова назначен, в любую группу. "Откомандированный сотрудник возвращается снова в свой отдел". Конечно, все зависит от задач, поставленных перед разрабочиком. Но есть весьма полезные рекомендации, которым стоит следовать -- общность и расширяемость.

MZX
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.10.2004 (Пт) 10:43

Сообщение MZX » 11.10.2004 (Пн) 11:10

Rainbow писал(а):По-моему так, повторное назначение - это ошибка... Ладно, в принципе, это вопрос к разработчику - нормальная это ситуация или нет...

Да, в моем случае это будет ошибкой, поэтому и решил создать ситуацию, при которой повторно назначить рабочего уже будет нельзя - в списке доступных его уже не будет.

Andrey Fedorov, спасибо, код работает. А ведь вчера до 3-х ночи с ним бился, никак не мог прийти к этому. Воистину, все гениальное просто :)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron