Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с SQL  (Прочитано 11439 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ilia
Помогающий

ru
Offline Offline
Пол: Мужской

« : 07-04-2004 06:09 » 

Здравствуйте, уважаемые знатоки!

Пишу небольшую БД - типа адресной базы по клиентам.
Есть у меня таблицы "Предприятия", "Подразделения", "Люди".
Допустим, Таблица "Предприятия" имеет первичный ключ code1,
Таблица "Подразделения" имеет первичный ключ code2 и внешний ключ code1.
Таблица "Люди" имеет внешние ключи code1 и code2.
Вопрос первый: могут ли внешние ключи быть null?  
И самое главное, мне надо собрать таблицу, где была бы информация о всех людях, предприятиях, на которых они работают и подразделениях, я пишу такой запрос:
SELECT Люди*, Предприятия.ИмяПредприятия, Подразделения.ИмяПодразделения
FROM Люди, Предприятия, Подразделения
WHERE Люди.code1=Предприятия.code1
AND Люди.code2=Подразделения.code2  
У меня выдает 0 записей.
Полагаю, это потому, что в таблице подразделения у меня пока нет ни одной записи, но по идее не для каждого человека из таблицы Люди должна быть запись в таблице Подразделения, а так получается, что тех людей, для которых в таблице Подразделения нет записей запрос мне не отобразит. Как быть?
Записан

Кто выпил весь кофе!
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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
Молодой специалист

us
Offline Offline

« Ответ #2 : 07-04-2004 06:33 » 

Ilia,
ты делаешь выборку сразу из некоторых таблиц

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

понимаешь?..

что значит "внешние ключи"?..
Записан

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

us
Offline Offline

« Ответ #3 : 07-04-2004 06:35 » 

Ilia,
я наверное парю..
ты вроде делаешь так как я предложил...
мне смутили строки
"
WHERE Люди.code1=Предприятия.code1
AND Люди.code2=Подразделения.code2
"
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-04-2004 06:45 » 

Цитата

мне смутили строки
"
WHERE Люди.code1=Предприятия.code1
AND Люди.code2=Подразделения.code2
"


Ну правильно они Вас смутили. Неявный JOIN с явным нарушением условий выборки. Основная таблица (master) -  "Люди"- приравнивать нужно к ней, а не ее.
Т.е.:  WHERE Предприятие.code1=Люди.code1.

И еще непонятно - зачем "подразделение" ссылается на "предприятие" если из "Люди" имеются и ссылки к обеим справочникам?
Записан

С уважением, Oldy.
Sommer
Молодой специалист

us
Offline Offline

« Ответ #5 : 07-04-2004 07:12 » 

Oldy, ко мне на "ты" Ага
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Ilia
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 07-04-2004 07:47 » 

Chaa, Sommer, Oldy, спасибо, я немного разобрался.
Действительно OUTER JOIN возвращает все записи.
Sommer, внешние ключи - foreign key - так у нас препод их называет.
Oldy, Подразделения у меня ссылаются на Предприятия потому, что, если можно так сказать, базовой таблицей у меня является Предприятие, Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, т.е. вполне вероятны ситуации когда для Предприятия есть запись о его подразделении, но нет ни одной записи о работнике.
Т.е. у меня не столько контактная книга Людей, сколько контактная книга Предприятий.
Записан

Кто выпил весь кофе!
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 07-04-2004 09:36 » 

Цитата

Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, ...


Чудны дела Твои господи Улыбаюсь))
Записан

С уважением, Oldy.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #8 : 07-04-2004 10:16 » 

Цитата
Предприятие может иметь или не иметь Подразделения и может иметь или не иметь Людей, ...


Ilia, тогда при таких условиях может ввести еще одну таблицу-связку
Пример
Таблицы "Предприятия", "Подразделения", "Люди", "Связи".
"Предприятия" имеет первичный ключ code1,
"Подразделения" имеет первичный ключ code2
"Люди" имеет первичный ключ code3
"Связи" имеет три поля - Code1, Code2, Code3

Хотя решать конечно тебе
Записан

I Have Nine Lives You Have One Only
THINK!
Ilia
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 07-04-2004 10:28 » 

HandKot, в принципе идея ясна, спасибо.
Я наверное попробую, поскольку чувствую, что правильно спроектировать даже такую простую базу данных не так уж и просто и стоит попробовать разные варианты.
Записан

Кто выпил весь кофе!
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #10 : 07-04-2004 14:21 » new

Ilia, это не моя идея. Так построена учебгая база "Борей" от Microsoft
(можно посмотреть в Access)
Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines