Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Добрый день!
Есть две таблицы: сотрудники и отделы. В каждом отделе есть начальник, который тоже является сотрудником. Чтобы хранить информацию о начальниках отделов я создала еще одну таблицу (диаграмма в приложении). Мне нужно выбрать 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

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

К сообщению приложен файл. Размер - 9Kb
27 май 18, 13:09    [21443920]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Folga
Подскажите, как сюда присоединить еще фамилию начальника?

Фамилия тебя где? Emp_Surname?
Она присоединена.
28 май 18, 03:00    [21444991]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Folga,

Одного начальника отдела или всех?
Если отдел без начальника?
28 май 18, 04:37    [21444996]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
LameUser
Member

Откуда:
Сообщений: 2028
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. Что-то сегодня повышенная активность студентов
28 май 18, 11:30    [21445752]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3352
LameUser
1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)

Сколько угодно.
28 май 18, 11:54    [21445891]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
LameUser
Member

Откуда:
Сообщений: 2028
982183
LameUser
1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)

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


Только в случаях совместительства, о чем здесь речь и не идет (судя по схеме бд).
28 май 18, 12:42    [21446111]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
LameUser,
Я не знаю, как бывает в реальной жизни, наверно это все оговаривается. В моем задании было оговорено только условие, что в отделе может быть только один начальник. Оно вроде соблюдено.
28 май 18, 12:45    [21446130]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Kopelly,
Нужно выбрать фамилию начальника отдела, в котором работает выбранный сотрудник.
28 май 18, 12:47    [21446138]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3352
"выбрать" - это "указать в запросе".
У тебя фамилия там есть
select .... Emp_Surname

Может ты хочешь в таблице связей хранить фамилию?
28 май 18, 12:50    [21446152]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
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
28 май 18, 13:04    [21446232]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Kopelly,
вы имеете ввиду завести отдельную таблицу для начальников заводить?
28 май 18, 22:10    [21448416]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Folga,

Я предлагаю Dir_PersNum перенести в таблицу Department.
Таблицу Director удалить за ненадобностью
29 май 18, 04:13    [21448678]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3352
ДеЖаВю
21390784
29 май 18, 04:19    [21448679]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Kopelly,
Да, я тоже об этом думала. Тогда получается, я сначала заполняю таблицу отделов и поле начальник оставляю пустым, потом заполняю таблицу сотрудников и добавляю в отделы начальников, правильно?
29 май 18, 10:20    [21449139]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
982183,
Спасибо за ссылку. Но я все равно не понимаю, как же правильней делать. Как будто раскритиковали оба способа. Это видимо вопрос из разряда "сколько людей, столько мнений".
Да и мой вопрос был собственно в другом.
29 май 18, 13:16    [21449969]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Folga,

из жизни обычно что-то вроде таблицы сотрудники, отделы, должности(тут либо сквозные или со связью на отделы) и таблица перемещений сотрудник - отдел - должность срок от(до) и долей (совомещение)
29 май 18, 15:55    [21450806]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
И все-таки как же сделать выборку?
Пишу запрос

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)

но он почему-то для всех сотрудников выдает один и тот же отдел и одного начальника. Подскажите, что не так?
30 май 18, 05:23    [21452244]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Folga,

Убери "top (10)" и посмотри на всю выборку.
30 май 18, 05:45    [21452260]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Пробовала еще вот так

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".
30 май 18, 05:47    [21452261]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
"Join" описывает что! и по каким условиям присоединять (а не уточняющее условие для указанных в "From" через "," таблиц)

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

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
30 май 18, 06:03    [21452268]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Folga
но тут говорит, что Не удалось привязать составной идентификатор "Employee.Emp_Dep".

Пишет потому что join'ы соединяются к Employee as EmpDirect, остальные таблицы перечисленные в "From" через запятую join'ам не видны.
30 май 18, 06:06    [21452270]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Kopelly,
если убрать "top 10", то все выдает правильно. А почему так? И как тогда выбрать именно 10 записей?
А вот
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

выдает только два столбца - Сотрудник и Возраст.
30 май 18, 14:23    [21454010]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из двух таблиц  [new]
Folga
Member

Откуда:
Сообщений: 23
Почитала подробнее про Тop, поняла в чем дело. Все получилось. А вот с join по прежнему непонятно.
30 май 18, 14:35    [21454059]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить