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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите решить задачку с собеседования. Использование Join 
:(
    Опции темы
vlad275
Дата 24.7.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вывести имена программистов C++ 

Таблицы                 Поля
ID_Table:               NameID, ProfessionID
Name_Table:          Name, NameID
Profession_Table:   Profession, ProfessionID


SELECT  Name_Table.Name  FROM Name_Table
INNER JOIN ID_Table ON ID_Table.ProdessionID = Profession_Table.ProfessionID 
INNER JOIN ID_Table ON ID_Table.NameID = Name_Table.NameID
WHERE Profession_Table.Profession='C++'

Правильно ли?


--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
Akina
Дата 24.7.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 45
Всего: 454



Смотря где. Аксесс, например, будет ругаться.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
vlad275
Дата 25.7.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А MS SQL Server?


--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
TaNK
Дата 25.7.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vlad275 @ 24.7.2008,  19:09)
Вывести имена программистов C++ 

Таблицы                 Поля
ID_Table:               NameID, ProfessionID
Name_Table:          Name, NameID
Profession_Table:   Profession, ProfessionID


SELECT  Name_Table.Name  FROM Name_Table
INNER JOIN ID_Table ON ID_Table.ProdessionID = Profession_Table.ProfessionID 
INNER JOIN ID_Table ON ID_Table.NameID = Name_Table.NameID
WHERE Profession_Table.Profession='C++'

Правильно ли?

а как сервер..определит...что за таблица Profession_Table.ProfessionID  если ты с ней не соединяешься
Код

SELECT  Name_Table.Name  FROM Name_Table
INNER JOIN ID_Table ON ID_Table.ProdessionID = Profession_Table.ProfessionID  -- вот тут
INNER JOIN ID_Table ON ID_Table.NameID = Name_Table.NameID
WHERE Profession_Table.Profession='C++'



может вот так надо ?
Код

SELECT  Name_Table.Name  FROM Name_Table
INNER JOIN ID_Table              ON ID_Table.NameID = Name_Table.NameID 
INNER JOIN Profession_Table ON ID_Table.ProfessionID = Profession_Table.ProfessionID
WHERE Profession_Table.Profession='C++'


Это сообщение отредактировал(а) TaNK - 25.7.2008, 12:53


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
vlad275
Дата 26.7.2008, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сразу после JOIN должна идти таблица для соединения? Я думал обе таблицы идущие после ON соединяются


--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
while
Дата 26.7.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



select nt.NAME
from PROFESSION_TABLE pt
left join ID_TABLE it on (it.PROFESSIONID = pt.PROFESSIONID)
left join NAME_TABLE nt on (nt.NAMEID = it.NAMEID)
where pt.PROFESSION = 'C++'
PM MAIL   Вверх
vlad275
Дата 26.7.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TaNK, 
Я правильно понял, что в  
"from PROFESSION_TABLE pt" идет соединение с PROFESSION_TABLE
"left join ID_TABLE it on (it.PROFESSIONID = pt.PROFESSIONID)" c ID_TABLE
"left join NAME_TABLE nt on (nt.NAMEID = it.NAMEID)" c NAME_TABLE 
и поменять их местами нельзя?



--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
Nigel
Дата 26.7.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


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

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



зачем 3 таблицы, когда можно обойтись двумя?
PM MAIL   Вверх
vlad275
Дата 26.7.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Такова была задачка на собеседовании


--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
while
Дата 27.7.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Я правильно понял, что в  
"from PROFESSION_TABLE pt" идет соединение с PROFESSION_TABLE


По русски:

Выбираем из таблицы PROFESSION_TABLE записи с профессией pt.PROFESSION = 'C++',
если таковые есть, то присоединяем ID_TABLE с записями, содержащими значения it.NAMEID,
для которых (если таковые имеются), из таблицы NAME_TABLE выбираем имена.

"если" - можно убрать, если имеються внешние ключи "между" указанными таблицами.

Цитата

и поменять их местами нельзя?


Что именно? Если первый и второй left join, то нет.

Вот.

А вообще для разных СУБД указанный запрос может давать разные результаты. Подобное наблюдалось. Проверь.

Это сообщение отредактировал(а) while - 27.7.2008, 00:31
PM MAIL   Вверх
vlad275
Дата 27.7.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А если INNER JOIN?


--------------------
Кто, как и зачем запустил этот механизм уничтожения России:
http://rutube.ru/tracks/54915.html?v=e74a9...c7e5d24da5656d8
PM MAIL   Вверх
goodday1941
Дата 27.7.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Nigel @  26.7.2008,  18:54 Найти цитируемый пост)
зачем 3 таблицы, когда можно обойтись двумя? 

ну помоему ситуация как раз мени ту мени...


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
while
Дата 27.7.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. LEFT JOIN: При выполнении условия сцепления таблиц, к значениям полей из первой таблицы присоединяются поля таблицы указанной в LEFT JOIN. Если условие не выполняется, присоединяются пустые поля второй таблицы, т.е. со значением NULL, но в любом случае из 1-й таблицы (стоящей слева от LEFT JOIN) будут выбраны записи (если они есть конечно).

2. INNER JOIN: Тоже, что и с LEFT JOIN, но отобраны будут записи при наличии СОВПАДЕНИЙ условия в обоих таблицах. Если условие не выполниться - записей не будет, в т.ч. из первой таблицы.

3. НО: если между таблицами есть "зависимости", т.е. FK - внешние ключи (или триггеры, контролирующие наличие записей в обоих таблицах), по связующим полям, можно ограничиться LEFT JOIN. А они  должны быть. Это часть логической целостности БД. Пример несоответствия, для которого INNER JOIN не вернет записей - в таблице ID_TABLE будет (будут) указаны имена (или) профессии, не содержащиеся в таблице (таблицах) NAME_TABLE (PROFESSION_TABLE).

4. Условия нужно уточнять при получении тестового задания.

Код

select nt.NAME
from PROFESSION_TABLE pt
inner join ID_TABLE it on (it.PROFESSIONID = pt.PROFESSIONID)
inner join NAME_TABLE nt on (nt.NAMEID = it.NAMEID)
where pt.PROFESSION = 'C++'

 даст тот же результат, см. п. 2.

А вообще нужно ЧИТАТЬ и ПРОБОВАТЬ. 

Цитата

зачем 3 таблицы, когда можно обойтись двумя? 


Да можно, конечно и одной. ЗАДАНИЕ ТАКОЕ. ТЕСТОВОЕ.




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


 




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


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

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