Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать из двух таблиц / 23 сообщений из 23, страница 1 из 1
27.05.2018, 13:09
    #39650597
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Добрый день!
Есть две таблицы: сотрудники и отделы. В каждом отделе есть начальник, который тоже является сотрудником. Чтобы хранить информацию о начальниках отделов я создала еще одну таблицу (диаграмма в приложении). Мне нужно выбрать 10 фамилий сотрудников, названия отдела, где работает и фамилию начальника.

select top (10)
concat(Emp_Surname, ' '+substring(Emp_Name,1,1)+'.', substring(Emp_patronymic,1,1)+'.') as Сотрудник,
Dep_title as Отдел
from Employee, Department
where Emp_Dep=Dep_id

Подскажите, как сюда присоединить еще фамилию начальника?
...
Рейтинг: 0 / 0
28.05.2018, 03:00
    #39650812
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
FolgaПодскажите, как сюда присоединить еще фамилию начальника?
Фамилия тебя где? Emp_Surname?
Она присоединена.
...
Рейтинг: 0 / 0
28.05.2018, 04:37
    #39650815
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Folga,

Одного начальника отдела или всех?
Если отдел без начальника?
...
Рейтинг: 0 / 0
28.05.2018, 11:30
    #39650939
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
FolgaДобрый день!
Есть две таблицы: сотрудники и отделы. В каждом отделе есть начальник, который тоже является сотрудником. Чтобы хранить информацию о начальниках отделов я создала еще одну таблицу (диаграмма в приложении). Мне нужно выбрать 10 фамилий сотрудников, названия отдела, где работает и фамилию начальника.

select top (10)
concat(Emp_Surname, ' '+substring(Emp_Name,1,1)+'.', substring(Emp_patronymic,1,1)+'.') as Сотрудник,
Dep_title as Отдел
from Employee, Department
where Emp_Dep=Dep_id

Подскажите, как сюда присоединить еще фамилию начальника?

1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)
2. Ваш cross join (Employee, Department) вернет несуществующие связки, вым нужно использовать обычный join .

P.S. Что-то сегодня повышенная активность студентов
...
Рейтинг: 0 / 0
28.05.2018, 11:54
    #39650961
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
LameUser1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)

Сколько угодно.
...
Рейтинг: 0 / 0
28.05.2018, 12:42
    #39651021
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
982183LameUser1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)

Сколько угодно.

Только в случаях совместительства, о чем здесь речь и не идет (судя по схеме бд).
...
Рейтинг: 0 / 0
28.05.2018, 12:45
    #39651024
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
LameUser,
Я не знаю, как бывает в реальной жизни, наверно это все оговаривается. В моем задании было оговорено только условие, что в отделе может быть только один начальник. Оно вроде соблюдено.
...
Рейтинг: 0 / 0
28.05.2018, 12:47
    #39651027
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Kopelly,
Нужно выбрать фамилию начальника отдела, в котором работает выбранный сотрудник.
...
Рейтинг: 0 / 0
28.05.2018, 12:50
    #39651030
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
"выбрать" - это "указать в запросе".
У тебя фамилия там есть
select .... Emp_Surname

Может ты хочешь в таблице связей хранить фамилию?
...
Рейтинг: 0 / 0
28.05.2018, 13:04
    #39651042
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
FolgaВ моем задании было оговорено только условие, что в отделе может быть только один начальник.
Тогда правильнее хранить Dir_ID в Department (Иначе есть завести несколько начальников в один отдел).

select top (10)
concat(Emp_Surname, ' '+substring(Emp_Name,1,1)+'.', substring(Emp_patronymic,1,1)+'.') as Сотрудник,
concat(EmployeeDirector.Emp_Surname, ' '+substring(EmployeeDirector.Emp_Name,1,1)+'.', substring(EmployeeDirector.Emp_patronymic,1,1)+'.') as Начальник,
Dep_title as Отдел
from Employee, Department, Director, Employee EmployeeDirector
where Emp_Dep=Department.Dep_id and Department.Dep_id = Director.Dep_id and EmployeeDirector.Emp_ID = Dir_PersNum
...
Рейтинг: 0 / 0
28.05.2018, 22:10
    #39651374
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Kopelly,
вы имеете ввиду завести отдельную таблицу для начальников заводить?
...
Рейтинг: 0 / 0
29.05.2018, 04:13
    #39651434
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Folga,

Я предлагаю Dir_PersNum перенести в таблицу Department.
Таблицу Director удалить за ненадобностью
...
Рейтинг: 0 / 0
29.05.2018, 04:19
    #39651435
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
ДеЖаВю
21390784
...
Рейтинг: 0 / 0
29.05.2018, 10:20
    #39651560
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Kopelly,
Да, я тоже об этом думала. Тогда получается, я сначала заполняю таблицу отделов и поле начальник оставляю пустым, потом заполняю таблицу сотрудников и добавляю в отделы начальников, правильно?
...
Рейтинг: 0 / 0
29.05.2018, 13:16
    #39651732
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
982183,
Спасибо за ссылку. Но я все равно не понимаю, как же правильней делать. Как будто раскритиковали оба способа. Это видимо вопрос из разряда "сколько людей, столько мнений".
Да и мой вопрос был собственно в другом.
...
Рейтинг: 0 / 0
29.05.2018, 15:55
    #39651883
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Folga,

из жизни обычно что-то вроде таблицы сотрудники, отделы, должности(тут либо сквозные или со связью на отделы) и таблица перемещений сотрудник - отдел - должность срок от(до) и долей (совомещение)
...
Рейтинг: 0 / 0
30.05.2018, 05:23
    #39652151
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
И все-таки как же сделать выборку?
Пишу запрос

select top (10)
concat(Employee.Emp_Surname, ' '+substring(Employee.Emp_Name,1,1)+'.', substring(Employee.Emp_patronymic,1,1)+'.') as Сотрудник,
datediff(year, Employee.Emp_birthday, Getdate()) as Возраст,
Dep_title as Отдел,
EmpDirect.Emp_Surname as Начальник
from Employee, Department, Director, Employee as EmpDirect
where (Employee.Emp_Dep=Department.Dep_id) and (EmpDirect.Emp_id=Dir_PersNum) and (EmpDirect.Emp_Dep=Employee.Emp_Dep)

но он почему-то для всех сотрудников выдает один и тот же отдел и одного начальника. Подскажите, что не так?
...
Рейтинг: 0 / 0
30.05.2018, 05:45
    #39652157
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Folga,

Убери "top (10)" и посмотри на всю выборку.
...
Рейтинг: 0 / 0
30.05.2018, 05:47
    #39652158
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Пробовала еще вот так

select top (10)
concat(Employee.Emp_Surname, ' '+substring(Employee.Emp_Name,1,1)+'.', substring(Employee.Emp_patronymic,1,1)+'.') as Сотрудник,
datediff(year, Employee.Emp_birthday, Getdate()) as Возраст
from Employee, Department, Director, Employee as EmpDirect
inner join Department as Отдел on Employee.Emp_Dep=Department.Dep_id
inner join EmpDirect as Начальник on Department.Dep_id = Director.Dir_Dep and EmpDirect.Emp_ID = Dir_PersNum

но тут говорит, что Не удалось привязать составной идентификатор "Employee.Emp_Dep".
...
Рейтинг: 0 / 0
30.05.2018, 06:03
    #39652160
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
"Join" описывает что! и по каким условиям присоединять (а не уточняющее условие для указанных в "From" через "," таблиц)

Так что через "join" надо писать так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
select top (10)
concat(Employee.Emp_Surname, ' '+substring(Employee.Emp_Name,1,1)+'.', substring(Employee.Emp_patronymic,1,1)+'.') as Сотрудник,
datediff(year, Employee.Emp_birthday, Getdate()) as Возраст
from Employee
inner join Department as Отдел on Employee.Emp_Dep=Отдел.Dep_id
inner join Director on Director.Dep_id  = Отдел.Dep_id
inner join Employee as EmpDirect on EmpDirect.Emp_ID = Director.Dir_PersNum
...
Рейтинг: 0 / 0
30.05.2018, 06:06
    #39652161
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Folgaно тут говорит, что Не удалось привязать составной идентификатор "Employee.Emp_Dep".
Пишет потому что join'ы соединяются к Employee as EmpDirect, остальные таблицы перечисленные в "From" через запятую join'ам не видны.
...
Рейтинг: 0 / 0
30.05.2018, 14:23
    #39652521
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Kopelly,
если убрать "top 10", то все выдает правильно. А почему так? И как тогда выбрать именно 10 записей?
А вот
Код: sql
1.
2.
3.
4.
5.
6.
7.
select top (10)
concat(Employee.Emp_Surname, ' '+substring(Employee.Emp_Name,1,1)+'.', substring(Employee.Emp_patronymic,1,1)+'.') as Сотрудник,
datediff(year, Employee.Emp_birthday, Getdate()) as Возраст
from Employee
inner join Department as Отдел on Employee.Emp_Dep=Отдел.Dep_id
inner join Director on Director.Dep_id  = Отдел.Dep_id
inner join Employee as EmpDirect on EmpDirect.Emp_ID = Director.Dir_PersNum


выдает только два столбца - Сотрудник и Возраст.
...
Рейтинг: 0 / 0
30.05.2018, 14:35
    #39652536
Folga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать из двух таблиц
Почитала подробнее про Тop, поняла в чем дело. Все получилось. А вот с join по прежнему непонятно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать из двух таблиц / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]