powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать из двух таблиц
23 сообщений из 23, страница 1 из 1
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39650812
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FolgaПодскажите, как сюда присоединить еще фамилию начальника?
Фамилия тебя где? Emp_Surname?
Она присоединена.
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #39650815
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folga,

Одного начальника отдела или всех?
Если отдел без начальника?
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39650961
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUser1. Ваша структура допускает, что один человек может быть начальником разных отделов (такое в жизни не бывает)

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

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

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

Может ты хочешь в таблице связей хранить фамилию?
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39651374
Folga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,
вы имеете ввиду завести отдельную таблицу для начальников заводить?
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #39651434
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folga,

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

из жизни обычно что-то вроде таблицы сотрудники, отделы, должности(тут либо сквозные или со связью на отделы) и таблица перемещений сотрудник - отдел - должность срок от(до) и долей (совомещение)
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39652157
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folga,

Убери "top (10)" и посмотри на всю выборку.
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39652161
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folgaно тут говорит, что Не удалось привязать составной идентификатор "Employee.Emp_Dep".
Пишет потому что join'ы соединяются к Employee as EmpDirect, остальные таблицы перечисленные в "From" через запятую join'ам не видны.
...
Рейтинг: 0 / 0
Выбрать из двух таблиц
    #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
Выбрать из двух таблиц
    #39652536
Folga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитала подробнее про Тop, поняла в чем дело. Все получилось. А вот с join по прежнему непонятно.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать из двух таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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