Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JOIN и WHERE 
:(
    Опции темы
oson
Дата 28.4.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Подскажите пожалуйста.
Вот запрос с WHERE
Код



SELECT ent.enterprise_name,dpt.depName, mng.manager_name, emp.second_name, adr.zipcode
FROM enterprise ent,department dpt, manager mng, employee emp, address adr
WHERE ent.address_id = adr.id
AND  dpt.enterprise_id = ent.id
AND  mng.department_id = dpt.id
AND  emp.manager_id = mng.id
AND  emp.address_id = adr.id;


как написать при помощи JOIN.
Получается, что address становится дважды алиасом.
Похоже, что JOIN намного неудобнее простого WHERE.
Чтото не пойму логики, как им пользоваться :(
Есть какой-то хороший туториалс?
PM MAIL   Вверх
oson
Дата 28.4.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



То есть получается его можно написать вот так
Код

SELECT  ent.enterprise_name,dpt.depName, mng.manager_name, emp.second_name, adr.zipcode
FROM
     enterprise ent JOIN address adr ON ent.address_id = adr.id
                    JOIN department dpt ON dpt.enterprise_id = ent.id
                    JOIN manager mng ON mng.department_id = dpt.id
                    JOIN employee emp ON emp.manager_id = mng.id
                    JOIN address adr1 ON emp.address_id = adr1.id;

если учитывать что address.id для employee и для enterprise - 2 разных ключа :(
И это наверное правильно - то есть еще один альяс сделать.
Но иногда ж пишут чтото типа 
Код

FROM
     enterprise ent JOIN address adr ON ent.address_id = adr.id AND adr.id = emp.address_id

Но во-первых так не работает, а во-вторых - когда и как надо писать?

PM MAIL   Вверх
Zloxa
Дата 28.4.2009, 23:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Объединения через where это тоже объединения. 
С технической точки зрения ваш запрос переписанный на join эквивалентен запросу с объединением в where.
Преимущество использования синтаксиса join, в данном случае, с моей точки зрения, в том, что происходит явное отделение критериев объединения множеств от критериев отбора. Что повышает читабельность.

Цитата(oson @  28.4.2009,  22:59 Найти цитируемый пост)
Но во-первых так не работает,

если вы внимательно подумаете, то поймете что в первом запросе тоже надо дважды соединяться с адресом. При условии конечно, что мы не желаем отобрать те employee  и те enterprise которые имеют общий адрес.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
oson
Дата 29.4.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Дело в том, что это делается тулза, которая должна сделать JOIN выбранных таблиц для любой структуры базы данных. То есть человек выбрал 5 таблиц из базы - и эта тулза должна догадаться, как их связать между собой. Поэтому мне нужен алгоритм построения этих JOIN в целом, то есть чтобы написать код, который будет эти джойны строить.
Есть ктото, кто настолько ясно представляет себе этот механизм, чтобы сформулировать четко правило этих джойнов? Заранее благодарен.
PM MAIL   Вверх
skyboy
Дата 29.4.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(oson @  29.4.2009,  10:00 Найти цитируемый пост)
и эта тулза должна догадаться, как их связать между собой

либо объединять по одноименным полям(утопия, когда над БД работают несколько человек, без неких правил семантически одно поле в разных таблицах может называться по-разному), либо парсить foreign key для выявления связей(не каждая БД и не всегда поддерживает foreign key), либо просить человека указать поля для связывания.
PM MAIL   Вверх
Gluttton
Дата 29.4.2009, 12:18 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

либо просить человека указать поля для связывания.


При этом можно предлагать предворительно сопоставив столбцу одной таблицы те поля другой таблицы у которых такой тип данных, который бы допускал соединение. (А для тех которых тип "не подходящий" - Enabled=false).

Так же можно "приоритетно" предлагать пользователю выбрать вариант связи.
Сначала для полей Unique, primary key - мол "скорее всего это должно Вам подойти", 
а лишь потом всё остальное.


--------------------
Слава Україні!
PM MAIL   Вверх
DimW
Дата 29.4.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



oson, неужели вы считаете что данный алгоритм можно реализовать за 1000 шагов или 10000000 шагов?
если бы все было так просто, то такое ПО было бы реализовано лет так 30 назад.
PM MAIL ICQ   Вверх
Zloxa
Дата 29.4.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(skyboy @  29.4.2009,  12:04 Найти цитируемый пост)
объединять по одноименным полям

Чисто для справки Natural join 
На практике - абсолютно бесполезная вещь.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.