Ilia
|
|
« : 07-04-2004 06:09 » |
|
Здравствуйте, уважаемые знатоки!
Пишу небольшую БД - типа адресной базы по клиентам. Есть у меня таблицы "Предприятия", "Подразделения", "Люди". Допустим, Таблица "Предприятия" имеет первичный ключ code1, Таблица "Подразделения" имеет первичный ключ code2 и внешний ключ code1. Таблица "Люди" имеет внешние ключи code1 и code2. Вопрос первый: могут ли внешние ключи быть null? И самое главное, мне надо собрать таблицу, где была бы информация о всех людях, предприятиях, на которых они работают и подразделениях, я пишу такой запрос: SELECT Люди*, Предприятия.ИмяПредприятия, Подразделения.ИмяПодразделения FROM Люди, Предприятия, Подразделения WHERE Люди.code1=Предприятия.code1 AND Люди.code2=Подразделения.code2 У меня выдает 0 записей. Полагаю, это потому, что в таблице подразделения у меня пока нет ни одной записи, но по идее не для каждого человека из таблицы Люди должна быть запись в таблице Подразделения, а так получается, что тех людей, для которых в таблице Подразделения нет записей запрос мне не отобразит. Как быть?
|
|
|
Записан
|
Кто выпил весь кофе!
|
|
|
Chaa
|
|
« Ответ #1 : 07-04-2004 06:32 » |
|
Вместо INNER JOIN использовать OUTER JOIN.
SELECT Люди*, Предприятия.ИмяПредприятия, Подразделения.ИмяПодразделения FROM Люди INNER JOIN Предприятия ON Люди.code1=Предприятия.code1 LEFT JOIN Подразделения ON Люди.code2=Подразделения.code2
Outer join м.б. LEFT JOIN, RIGHT JOIN, FULL JOIN. Поэкспериментируй.
|
|
|
Записан
|
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #2 : 07-04-2004 06:33 » |
|
Ilia, ты делаешь выборку сразу из некоторых таблиц
я думаю более логичнго было бы создать болшую таблицу, в которой скажем в поле предприятие стояли не названия предприятий, а индексы соответсвующих названий в таблице предприятие т.е. на все что имеет ограниченную разновидность(например, типы предприятий )сделать по таблице, а в главную вставлять индексы и уже делать запрос из одной таблицы
понимаешь?..
что значит "внешние ключи"?..
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #3 : 07-04-2004 06:35 » |
|
Ilia, я наверное парю.. ты вроде делаешь так как я предложил... мне смутили строки " WHERE Люди.code1=Предприятия.code1 AND Люди.code2=Подразделения.code2 "
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Oldy
|
|
« Ответ #4 : 07-04-2004 06:45 » |
|
мне смутили строки " WHERE Люди.code1=Предприятия.code1 AND Люди.code2=Подразделения.code2 "
Ну правильно они Вас смутили. Неявный JOIN с явным нарушением условий выборки. Основная таблица (master) - "Люди"- приравнивать нужно к ней, а не ее. Т.е.: WHERE Предприятие.code1=Люди.code1. И еще непонятно - зачем "подразделение" ссылается на "предприятие" если из "Люди" имеются и ссылки к обеим справочникам?
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #5 : 07-04-2004 07:12 » |
|
Oldy, ко мне на "ты"
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Ilia
|
|
« Ответ #6 : 07-04-2004 07:47 » |
|
Chaa, Sommer, Oldy, спасибо, я немного разобрался. Действительно OUTER JOIN возвращает все записи. Sommer, внешние ключи - foreign key - так у нас препод их называет. Oldy, Подразделения у меня ссылаются на Предприятия потому, что, если можно так сказать, базовой таблицей у меня является Предприятие, Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, т.е. вполне вероятны ситуации когда для Предприятия есть запись о его подразделении, но нет ни одной записи о работнике. Т.е. у меня не столько контактная книга Людей, сколько контактная книга Предприятий.
|
|
|
Записан
|
Кто выпил весь кофе!
|
|
|
Oldy
|
|
« Ответ #7 : 07-04-2004 09:36 » |
|
Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, ...
Чудны дела Твои господи ))
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #8 : 07-04-2004 10:16 » |
|
Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, ... Ilia, тогда при таких условиях может ввести еще одну таблицу-связку Пример Таблицы "Предприятия", "Подразделения", "Люди", "Связи". "Предприятия" имеет первичный ключ code1, "Подразделения" имеет первичный ключ code2 "Люди" имеет первичный ключ code3 "Связи" имеет три поля - Code1, Code2, Code3 Хотя решать конечно тебе
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Ilia
|
|
« Ответ #9 : 07-04-2004 10:28 » |
|
HandKot, в принципе идея ясна, спасибо. Я наверное попробую, поскольку чувствую, что правильно спроектировать даже такую простую базу данных не так уж и просто и стоит попробовать разные варианты.
|
|
|
Записан
|
Кто выпил весь кофе!
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #10 : 07-04-2004 14:21 » |
|
Ilia, это не моя идея. Так построена учебгая база "Борей" от Microsoft (можно посмотреть в Access)
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
|